diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 32800a6e16..0090e612b6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,14 +38,14 @@ jobs: steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 name: Checkout repository - name: Stack version shell: bash run: GHC_VERSION=${{ matrix.GHC_VERSION }} make stack.yaml - - uses: actions/cache@v3 + - uses: actions/cache@v4 name: Cache stack with: path: | diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/publish-ghcr.yml similarity index 86% rename from .github/workflows/docker-publish.yml rename to .github/workflows/publish-ghcr.yml index e60979ec64..49f4a54c21 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/publish-ghcr.yml @@ -1,4 +1,4 @@ -name: Publishing Docker image to ghcr.io +name: Publishing container on ghcr.io # This workflow uses actions that are not certified by GitHub. # They are provided by a third-party and are governed by @@ -20,7 +20,7 @@ on: pull_request: # and for PRs that edit the docker files paths: - Dockerfile - - .github/workflows/docker-publish.yml + - .github/workflows/publish-ghcr.yml # other branches that want testing must create a PR @@ -50,16 +50,16 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Set up buildx (Docker CLI plugin for extended build capabilities with BuildKit) - name: Setup Docker buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 # Login against a Docker registry except on PR - name: Log into registry if: github.event_name != 'pull_request' - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -68,14 +68,18 @@ jobs: # Extract metadata (tags, labels) for Docker - name: Extract Docker metadata id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + - name: Extract git version + shell: bash + run: bash etc/build/version.sh + # Build and push Docker image with Buildx (don't push on PR) - name: Build and push Docker image id: build-and-push - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v5 with: context: . push: ${{ github.event_name != 'pull_request' }} # do not push if this was triggered by a PR diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 776414e7fe..0afd68c888 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -40,14 +40,14 @@ jobs: steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 name: Checkout repository - name: Stack version shell: bash run: GHC_VERSION=${{ matrix.GHC_VERSION }} make stack.yaml - - uses: actions/cache@v3 + - uses: actions/cache@v4 name: Cache stack with: path: | @@ -72,14 +72,17 @@ jobs: run: | echo "${HOME}/solver-binaries" >> ${GITHUB_PATH} - - name: Installing dependencies (gperf) on Linux + # libnuma-dev for runsolver + # autoconf, cmake, gmp for yices + + - name: Installing dependencies on Linux shell: bash - run: sudo apt-get install -y gperf + run: sudo apt-get install -y gperf libnuma-dev if: runner.os == 'Linux' - - name: Installing dependencies (gperf) on macOS + - name: Installing dependencies on macOS shell: bash - run: brew install gperf + run: brew install autoconf cmake gmp gperf if: runner.os == 'macOS' - name: Build solvers diff --git a/.github/workflows/solvers.yml b/.github/workflows/solvers.yml index 799918c488..60a6c90b60 100644 --- a/.github/workflows/solvers.yml +++ b/.github/workflows/solvers.yml @@ -10,12 +10,12 @@ on: branches: - main # run for the main branch paths: - - etc/build/install*.sh + - etc/build/*.sh - Makefile - .github/workflows/solvers.yml pull_request: # and for PRs paths: - - etc/build/install*.sh + - etc/build/*.sh - Makefile - .github/workflows/solvers.yml # other branches that want testing must create a PR @@ -36,7 +36,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 name: Checkout repository - name: Run sccache-cache @@ -47,14 +47,17 @@ jobs: run: | echo "${HOME}/.local/bin" >> ${GITHUB_PATH} - - name: Installing dependencies (gperf) on Linux + # libnuma-dev for runsolver + # autoconf, cmake, gmp for yices + + - name: Installing dependencies on Linux shell: bash - run: sudo apt-get install -y gperf + run: sudo apt-get install -y gperf libnuma-dev if: runner.os == 'Linux' - - name: Installing dependencies (gperf) on macOS + - name: Installing dependencies on macOS shell: bash - run: brew install gperf + run: brew install autoconf cmake gmp gperf if: runner.os == 'macOS' - name: Building solvers diff --git a/.github/workflows/test-coverage.yml b/.github/workflows/test-coverage.yml index 6d2d47daad..28b5d638e8 100644 --- a/.github/workflows/test-coverage.yml +++ b/.github/workflows/test-coverage.yml @@ -29,14 +29,14 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 name: Checkout repository - name: Stack version shell: bash run: make stack.yaml - - uses: actions/cache@v3 + - uses: actions/cache@v4 name: Cache stack with: path: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5915c794a7..25d773bbdc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ on: paths: - conjure-cp.cabal - Makefile - - Dockerfile # this is here because the docker-publish.yml depends on successful completion of this action + - Dockerfile # this is here because publish-ghcr.yml depends on successful completion of this action - src/** - tests/** - etc/build/** @@ -42,14 +42,14 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 name: Checkout repository - name: Stack version shell: bash run: make stack.yaml - - uses: actions/cache@v3 + - uses: actions/cache@v4 name: Cache stack with: path: | diff --git a/Dockerfile b/Dockerfile index 3749b52dae..d3067b96a4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,13 +9,13 @@ # Setting up FROM ubuntu:23.10 AS builder ENV DEBIAN_FRONTEND noninteractive -WORKDIR /conjure/ +WORKDIR /conjure # All binaries will end up in /root/.local/bin RUN mkdir -p /root/.local/bin ENV PATH /root/.local/bin:$PATH ENV LD_LIBRARY_PATH /root/.local/bin/lib:$LD_LIBRARY_PATH -ENV MZN_STDLIB_DIR /root/.local/bin/share/minizinc/ +ENV MZN_STDLIB_DIR /root/.local/bin/share/minizinc # Dependencies RUN apt-get update RUN apt-get install -y --no-install-recommends build-essential # so we can compile stuff @@ -30,6 +30,7 @@ RUN apt-get install -y --no-install-recommends autoconf # needed RUN apt-get install -y --no-install-recommends gperf # needed when building some solvers (for example yices) RUN apt-get install -y --no-install-recommends python3 # needed when building some solvers (for example z3) RUN apt-get install -y --no-install-recommends default-jre-headless # savilerow +RUN apt-get install -y --no-install-recommends libnuma-dev # runsolver # Only copying the install*.sh scripts RUN mkdir -p etc @@ -51,17 +52,28 @@ RUN PROCESSES=2 etc/build/install-open-wbo.sh RUN PROCESSES=2 etc/build/install-ortools.sh RUN PROCESSES=2 etc/build/install-yices.sh RUN PROCESSES=2 etc/build/install-z3.sh +RUN PROCESSES=2 etc/build/install-runsolver.sh -# Copy everything -COPY . . +# An attempt to cache more +COPY Makefile Makefile +COPY etc/hs-deps etc/hs-deps +COPY conjure-cp.cabal conjure-cp.cabal +RUN make installdeps -# Building Conjure and copying Savile Row +# Copy the rest +COPY etc etc +COPY src src +COPY LICENSE LICENSE RUN make install # List the binaries RUN ls -l /root/.local/bin RUN du -sh /root/.local/bin +# Copy the allsolvers test case +RUN mkdir -p tests +COPY tests/allsolvers tests/allsolvers + # a test to see if all solvers work as expected RUN tests/allsolvers/test.sh @@ -73,8 +85,9 @@ FROM ubuntu:23.10 WORKDIR /conjure ENV PATH /root/.local/bin:$PATH ENV LD_LIBRARY_PATH /root/.local/bin/lib:$LD_LIBRARY_PATH -ENV MZN_STDLIB_DIR /root/.local/bin/share/minizinc/ -RUN apt-get update -RUN apt-get install -y --no-install-recommends default-jre-headless # savilerow +ENV MZN_STDLIB_DIR /root/.local/bin/share/minizinc +RUN apt-get update && apt-get install -y --no-install-recommends build-essential # so we can compile stuff +RUN apt-get update && apt-get install -y --no-install-recommends default-jre-headless # savilerow +RUN apt-get update && apt-get install -y --no-install-recommends libnuma-dev # runsolver RUN mkdir -p /root/.local/bin/lib COPY --from=builder /root/.local/bin /root/.local/bin diff --git a/LICENSE b/LICENSE index e8ae984e2f..4f33728243 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright 2009-2023 Özgür Akgün +Copyright 2009-2024 Özgür Akgün School of Computer Science, University of St Andrews All rights reserved. diff --git a/Makefile b/Makefile index f7d34c546d..ff80ebe6c2 100644 --- a/Makefile +++ b/Makefile @@ -53,6 +53,14 @@ install: @echo @echo +# mainly for CI +.PHONY: installdeps +installdeps: + bash etc/build/install-stack.sh + make stack.yaml + stack --local-bin-path ${BIN_DIR} setup; + stack build --only-dependencies + .PHONY: test test: @if ${COVERAGE}; then \ @@ -150,4 +158,5 @@ solvers: @etc/build/silent-wrapper.sh etc/build/install-minizinc.sh @etc/build/silent-wrapper.sh etc/build/install-yices.sh @etc/build/silent-wrapper.sh etc/build/install-z3.sh + @etc/build/silent-wrapper.sh etc/build/install-runsolver.sh @if ls make-solvers-*.stderr make-solvers-*.stdout > /dev/null 2> /dev/null; then echo "At least one solver didn't build successfully."; exit 1; fi diff --git a/conjure-cp.cabal b/conjure-cp.cabal index 1107b14113..306acb4f38 100644 --- a/conjure-cp.cabal +++ b/conjure-cp.cabal @@ -259,6 +259,7 @@ Library , Conjure.UI.ParameterGenerator , Conjure.UI.NormaliseQuantified , Conjure.UI.ErrorDisplay + , Conjure.UI.SolveStats , Conjure.LSP.LanguageServer , Conjure.LSP.Documentation @@ -329,6 +330,7 @@ Library , template-haskell , http-client , http-client-tls + , hostname default-extensions: FlexibleContexts diff --git a/docs/conjure-help.html b/docs/conjure-help.html index c5b17a7b79..a96299d688 100644 --- a/docs/conjure-help.html +++ b/docs/conjure-help.html @@ -136,6 +136,10 @@  --seed=INTRandom number generator seed.  --limit-models=INTMaximum number of models to generate.  --use-existing-models=FILEFile names of Essence' models generated beforehand.
If given, Conjure skips the modelling phase and uses the existing models for solving.
The models should be inside the output directory (See -o). +runsolver: + --runsolver-cpu-time-limit=INTUse runsolver to limit total CPU time (in seconds) + --runsolver-wall-time-limit=INTUse runsolver to limit total elapsed time (in seconds) + --runsolver-memory-limit=INTUse runsolver to limit total memory usage (Maximum RSS - in megabytes). Options for other tools:  --savilerow-options=ITEMOptions passed to Savile Row.  --solver-options=ITEMOptions passed to the backend solver. diff --git a/docs/conjure-help.txt b/docs/conjure-help.txt index bf34cb8af9..b02a93208e 100644 --- a/docs/conjure-help.txt +++ b/docs/conjure-help.txt @@ -269,6 +269,10 @@ If given, Conjure skips the modelling phase and uses the existing models for solving. The models should be inside the output directory (See -o). + runsolver: + --runsolver-cpu-time-limit=INT Use runsolver to limit total CPU time (in seconds) + --runsolver-wall-time-limit=INT Use runsolver to limit total elapsed time (in seconds) + --runsolver-memory-limit=INT Use runsolver to limit total memory usage (Maximum RSS - in megabytes). Options for other tools: --savilerow-options=ITEM Options passed to Savile Row. --solver-options=ITEM Options passed to the backend solver. diff --git a/docs/installation.rst b/docs/installation.rst index 1a25ed652d..cfa4560d94 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -16,6 +16,16 @@ It may be useful to save the binary under a directory that is in your search PAT For Windows, please use the Linux binaries with the `Windows Subsystem for Linux `_. +To Install into wsl2 on Windows then use the following commands + +.. code-block:: bash + + cd + wget https://github.com/conjure-cp/conjure/releases/download/v2.5.1/conjure-v2.5.1-linux-with-solvers.zip + unzip conjure-v2.5.1-linux-with-solvers.zip + echo 'export PATH="$HOME/conjure-v2.5.1-linux-with-solvers:$PATH"' >> ~/.zshrc + +Then restart your shell ! Compiling from source --------------------- @@ -51,3 +61,56 @@ An up-to-date version of Savile Row is also copied next to the Conjure executabl A standalone version of Savile Row and user documentation for Savile Row can be downloaded from `its website `_. + +Docker/Podman +------------- + +We release an container image that can be used via Docker or Podman. + +- The latest release is always at ghcr.io/conjure-cp/conjure:latest + +- The latest commit on main is at ghcr.io/conjure-cp/conjure:main + +- You can also use a specific version using the SHA of a particular image: ghcr.io/conjure-cp/conjure@sha256:VERSION + +See all available images on `Github `_. + +Inside the container, you will be able to run conjure, savilerow, and almost all supported solvers. + +CPLEX with Docker/Podman +------------------------ + +CPLEX is a commercial mathemathical programming solver that is supported by Conjure. However we cannot provide CPLEX as part of the container image due to its license. Instead, we include instructions here for building another image that contains CPLEX as well. + +Obtain a commercial or academic license for CPLEX. Use the instructions on `its website `_. Notes on `this post `_ are helpful too. + +We assume you are on a Linux system here, though steps for macOS are very similar. + +- Download the installer. A file called ``cplex_studio2211.linux_x86_64.bin``. +- Run the installer and follow the instructions. +- You can install CPLEX to its default location, however a user-level install is also possible. Assuming you installed it at: ``/home/USER/cplex-install`` for the remaining instructions +- Create a file called ``/home/USER/cplex-install/Dockerfile`` with the following contents + +.. code-block:: bash + + FROM ghcr.io/conjure-cp/conjure@sha256:VERSION + COPY cplex /root/.local/cplex + ENV CPLEX_PATH /root/.local/cplex/bin/x86-64_linux/libcplex2211.so + +- In the ``/home/USER/cplex-install`` directory execute: ``podman build -t conjure-cplex .`` + +- ``podman images`` should now list ``localhost/conjure-cplex`` as well as a bunch of other images. + +- You can replace podman with docker in the last 2 commands to use docker instead. + + + + + + + + + + + + diff --git a/etc/build/install-minion.sh b/etc/build/install-minion.sh index 7c8db7e702..cc53d49e78 100755 --- a/etc/build/install-minion.sh +++ b/etc/build/install-minion.sh @@ -19,11 +19,11 @@ pushd tmp-install-minion OS=$(uname) if [ "$OS" == "Darwin" ]; then - download https://savilerow.cs.st-andrews.ac.uk/savilerow-$VERSION-mac.tgz + download https://www-users.york.ac.uk/peter.nightingale/savilerow/savilerow-$VERSION-mac.tgz tar zxf savilerow-$VERSION-mac.tgz mv savilerow-$VERSION-mac/bin/minion ${BIN_DIR}/minion elif [ "$OS" == "Linux" ]; then - download https://savilerow.cs.st-andrews.ac.uk/savilerow-$VERSION-linux.tgz + download https://www-users.york.ac.uk/peter.nightingale/savilerow/savilerow-$VERSION-linux.tgz tar zxf savilerow-$VERSION-linux.tgz mv savilerow-$VERSION-linux/bin/minion ${BIN_DIR}/minion else diff --git a/etc/build/install-runsolver.sh b/etc/build/install-runsolver.sh new file mode 100755 index 0000000000..6254bdd548 --- /dev/null +++ b/etc/build/install-runsolver.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# version as of 25 March 2024 +# alas, none of the published releases compile correctly +VERSION='42f77c75fc511341f475f378f7bc1e5b3d708afb' + +set -o errexit +set -o nounset + +DIR="$( cd "$( dirname "$0" )" && pwd )" + +export BIN_DIR=${BIN_DIR:-${HOME}/.local/bin} +export PROCESSES=${PROCESSES:-1} + +OS=$(uname) + +if [ "$OS" == "Linux" ]; then + rm -rf tmp-install-runsolver + mkdir tmp-install-runsolver + pushd tmp-install-runsolver + git clone https://github.com/ozgurakgun/runsolver.git + cd runsolver + git checkout $VERSION + cd src + if make -j${PROCESSES} ; then + echo "Built." + else + echo "Build failed, trying again with a local patch" + echo "This might happen when building with an old version of libnuma-dev" + patch runsolver.cc ${DIR}/runsolver.patch + make -j${PROCESSES} + fi + cp runsolver ${BIN_DIR}/runsolver + echo "runsolver executable is at ${BIN_DIR}/runsolver" + ls -l ${BIN_DIR}/runsolver + popd + rm -rf tmp-install-runsolver +else + echo "Your OS is (according to uname): ${OS} -- runsolver only works on linux." +fi diff --git a/etc/build/runsolver.patch b/etc/build/runsolver.patch new file mode 100644 index 0000000000..dcbf652225 --- /dev/null +++ b/etc/build/runsolver.patch @@ -0,0 +1,13 @@ +diff --git a/src/runsolver.cc b/src/runsolver.cc +index 5128a9b..a4c3e67 100644 +--- a/src/runsolver.cc ++++ b/src/runsolver.cc +@@ -915,7 +915,7 @@ void numaInfo() { + return; + + int nbNodes = numa_num_configured_nodes(); +- long mem, memFree; ++ long long mem, memFree; + + if (!quiet_progress) { + cout << "NUMA information:\n"; diff --git a/etc/build/silent-wrapper.sh b/etc/build/silent-wrapper.sh index 2cb14d3e3f..aa74b3f308 100755 --- a/etc/build/silent-wrapper.sh +++ b/etc/build/silent-wrapper.sh @@ -1,38 +1,63 @@ #!/bin/bash -# set -o errexit -# set -o nounset +set -o errexit +set -o nounset if [ $# -ne 1 ]; then echo "Only provide a single argument, the path to a bash script." exit 1 fi -echo "Running $1" +export CI=${CI:-false} -PID=$$ -export STARTTIME=$(date +%s) -bash $1 > make-solvers-${PID}.stdout 2> make-solvers-${PID}.stderr -EXITCODE=$? -export ELAPSED=$(($(date +%s) - ${STARTTIME})) +if ${CI}; then + echo "Running $1 in CI" +else + echo "Running $1" +fi -if [ ${EXITCODE} -eq 0 ] ; then +if ${CI}; then + export STARTTIME=$(date +%s) + bash $1 + EXITCODE=$? + export ELAPSED=$(($(date +%s) - ${STARTTIME})) echo " Done (took ${ELAPSED} seconds)" - rm -f make-solvers-${PID}.stdout make-solvers-${PID}.stderr -else - echo " Failed (took ${ELAPSED} seconds)" echo " Exit code: ${EXITCODE}" - echo " Outputs saved to: make-solvers-${PID}.stdout and make-solvers-${PID}.stderr" - echo "" - echo "Last 10 lines of the stdout was:" - tail -n10 make-solvers-${PID}.stdout - echo "" - echo "Last 10 lines of the stderr was:" - tail -n10 make-solvers-${PID}.stderr - echo "" - echo "" - echo "" -fi + exit ${EXITCODE} +else + + PID=$$ + export STARTTIME=$(date +%s) + bash $1 > make-solvers-${PID}.stdout 2> make-solvers-${PID}.stderr + EXITCODE=$? + export ELAPSED=$(($(date +%s) - ${STARTTIME})) + + if [ ${EXITCODE} -eq 0 ] ; then + echo " Done (took ${ELAPSED} seconds)" + rm -f make-solvers-${PID}.stdout make-solvers-${PID}.stderr + else + echo " Failed (took ${ELAPSED} seconds)" + echo " Exit code: ${EXITCODE}" + echo " Outputs saved to: make-solvers-${PID}.stdout and make-solvers-${PID}.stderr" + echo "" + if ${CI}; then + echo "stdout was:" + cat make-solvers-${PID}.stdout + echo "" + echo "stderr was:" + cat make-solvers-${PID}.stderr + else + echo "Last 10 lines of the stdout was:" + tail -n10 make-solvers-${PID}.stdout + echo "" + echo "Last 10 lines of the stderr was:" + tail -n10 make-solvers-${PID}.stderr + fi + echo "" + echo "" + echo "" + fi -# exit ${EXITCODE} -exit 0 + # exit ${EXITCODE} + exit 0 +fi \ No newline at end of file diff --git a/etc/savilerow/savilerow b/etc/savilerow/savilerow index bec411d645..d57cb4cbc4 100755 --- a/etc/savilerow/savilerow +++ b/etc/savilerow/savilerow @@ -17,11 +17,11 @@ case "$@" in cgcreate -g cpu:/$GROUP_NAME cgset -r cpu.cfs_quota_us=1000000 $GROUP_NAME cgset -r cpu.cfs_period_us=1000000 $GROUP_NAME - cgexec -g cpu:$GROUP_NAME java -ea -XX:ParallelGCThreads=1 -Djava.library.path=$DIR/lib/ -Xmx8G -jar "$DIR/savilerow.jar" "$@" + cgexec -g cpu:$GROUP_NAME java -ea -XX:+UseG1GC -XX:ParallelGCThreads=1 -Djava.library.path=$DIR/lib/ -Xmx8G -jar "$DIR/savilerow.jar" "$@" cgdelete -g cpu:/$GROUP_NAME fi ;; *) - java -ea -XX:ParallelGCThreads=1 -Djava.library.path=$DIR/lib/ -Xmx8G -jar "$DIR/savilerow.jar" "$@" + java -ea -XX:+UseG1GC -XX:ParallelGCThreads=1 -Djava.library.path=$DIR/lib/ -Xmx8G -jar "$DIR/savilerow.jar" "$@" ;; esac diff --git a/etc/savilerow/savilerow.jar b/etc/savilerow/savilerow.jar index 13b1bd62e7..a877b1bb94 100644 Binary files a/etc/savilerow/savilerow.jar and b/etc/savilerow/savilerow.jar differ diff --git a/src/Conjure/Language/RepresentationOf.hs b/src/Conjure/Language/RepresentationOf.hs index 01c5ea1f11..c42feae252 100644 --- a/src/Conjure/Language/RepresentationOf.hs +++ b/src/Conjure/Language/RepresentationOf.hs @@ -1,39 +1,42 @@ module Conjure.Language.RepresentationOf where -- conjure -import Conjure.Prelude -import Conjure.Language.Domain -import Conjure.Language.Type ( TypeCheckerMode ) +import Conjure.Language.Domain +import Conjure.Language.Type (TypeCheckerMode) +import Conjure.Prelude class RepresentationOf a where - representationTreeOf - :: (MonadFailDoc m, ?typeCheckerMode :: TypeCheckerMode) - => a -> m (Tree (Maybe HasRepresentation)) + representationTreeOf :: + (MonadFailDoc m, ?typeCheckerMode :: TypeCheckerMode) => + a -> + m (Tree (Maybe HasRepresentation)) representationOf :: (RepresentationOf a, MonadFailDoc m, ?typeCheckerMode :: TypeCheckerMode) => a -> m HasRepresentation -representationOf a = do - tree <- representationTreeOf a - case rootLabel tree of - Nothing -> failDoc "doesn't seem to have a representation" +representationOf a = + case representationTreeOf a of + Nothing -> failDoc "doesn't seem to have a representation tree" + Just tree -> + case rootLabel tree of + Nothing -> failDoc "doesn't seem to have a representation" Just NoRepresentation -> failDoc "doesn't seem to have a representation" Just r -> return r hasRepresentation :: (RepresentationOf a, MonadFailDoc m, ?typeCheckerMode :: TypeCheckerMode) => a -> m () hasRepresentation x = - case representationOf x of - Nothing -> failDoc "doesn't seem to have a representation" - Just _ -> return () + case representationTreeOf x of + Nothing -> failDoc "doesn't seem to have a representation" + Just _ -> return () sameRepresentation :: (RepresentationOf a, MonadFailDoc m, ?typeCheckerMode :: TypeCheckerMode) => a -> a -> m () sameRepresentation x y = - case (representationOf x, representationOf y) of - (Just rx, Just ry) | rx == ry -> return () - _ -> failDoc "doesn't seem to have the same representation" + case (representationOf x, representationOf y) of + (Just rx, Just ry) | rx == ry -> return () + _ -> failDoc "doesn't seem to have the same representation" sameRepresentationTree :: (RepresentationOf a, MonadFailDoc m, ?typeCheckerMode :: TypeCheckerMode) => a -> a -> m () sameRepresentationTree x y = do - xTree <- representationTreeOf x - yTree <- representationTreeOf y - unless (xTree == yTree) $ - failDoc "doesn't seem to have the same representation tree" + xTree <- representationTreeOf x + yTree <- representationTreeOf y + unless (xTree == yTree) + $ failDoc "doesn't seem to have the same representation tree" diff --git a/src/Conjure/Language/Validator.hs b/src/Conjure/Language/Validator.hs index 1b5a3d21f7..d0a78abdc0 100644 --- a/src/Conjure/Language/Validator.hs +++ b/src/Conjure/Language/Validator.hs @@ -2399,14 +2399,15 @@ functionOps l = case l of return $ if null a' || null b' then Nothing else Just () preImageArgs :: SArg -> SArg -> Validator () - preImageArgs (r1, a) (r2, b) = do - let t = case (typeOf_ a, typeOf_ b) of - (TypeFunction _ i, tb) -> mostDefinedS [i, tb] - (TypeSequence i, _) -> i - (_, tb) -> tb - a' <- unifyTypesFailing (TypeFunction TypeAny t) (r1, a) - b' <- unifyTypesFailing t (r2, b) - return $ if null a' || null b' then Nothing else Just () + preImageArgs _ _ = return $ Just () + -- preImageArgs (r1, a) (r2, b) = do + -- let t = case (typeOf_ a, typeOf_ b) of + -- (TypeFunction _ i, tb) -> mostDefinedS [i, tb] + -- (TypeSequence i, _) -> i + -- (_, tb) -> tb + -- a' <- unifyTypesFailing (TypeFunction TypeAny t) (r1, a) + -- b' <- unifyTypesFailing t (r2, b) + -- return $ if null a' || null b' then Nothing else Just () partyArgs :: SArg -> SArg -> Validator () partyArgs (r1, a) (r2, b) = do diff --git a/src/Conjure/Process/Enumerate.hs b/src/Conjure/Process/Enumerate.hs index db9a2493f6..1d727645e4 100644 --- a/src/Conjure/Process/Enumerate.hs +++ b/src/Conjure/Process/Enumerate.hs @@ -143,6 +143,9 @@ enumerateDomain d = liftIO' $ withSystemTempDirectory ("conjure-enumerateDomain- , nbSolutions = show enumerateDomainMax , copySolutions = False , solutionsInOneFile = False + , runsolverCPUTimeLimit = Nothing + , runsolverWallTimeLimit = Nothing + , runsolverMemoryLimit = Nothing , logLevel = LogNone -- default values for the rest , essenceParams = [] diff --git a/src/Conjure/Process/Streamlining.hs b/src/Conjure/Process/Streamlining.hs index 8231550434..19d137713e 100644 --- a/src/Conjure/Process/Streamlining.hs +++ b/src/Conjure/Process/Streamlining.hs @@ -31,14 +31,14 @@ streamliningToStdout model = do showStr :: String -> Doc showStr = pretty . show - + streamliners <- streamlining model liftIO $ print $ prettyList prBraces "," - [ (showStr $ show i) <> ":" <+> prBraces (vcat + [ showStr (show i) <> ":" <+> prBraces (vcat [ showStr "onVariable" <> ":" <+> showStr (show (pretty nm)) <> "," - , showStr "groups" <> ":" <+> prettyList prBrackets "," (map showStr groups) <> "," - , showStr "constraint" <> ":" <+> (showStr $ map whitespace $ show $ pretty cons) + , showStr "groups" <> ":" <+> prettyList prBrackets "," (map showStr (nub groups)) <> "," + , showStr "constraint" <> ":" <+> showStr (map whitespace $ show $ pretty cons) ]) | (i, (nm, (cons, groups))) <- zip allNats streamliners ] @@ -53,16 +53,15 @@ streamlining :: (?typeCheckerMode :: TypeCheckerMode) => Model -> m [(Name, Streamliner)] streamlining model = do - concatForM (mStatements model) $ \ statement -> - case statement of - Declaration (FindOrGiven Find nm domain) -> do - let ref = Reference nm (Just (DeclNoRepr Find nm domain NoRegion)) - streamliners <- streamlinersForSingleVariable ref - -- traceM $ show $ vcat [ "Streamliners for --" <+> pretty statement - -- , vcat [ nest 4 (vcat (pretty x : map pretty gs)) | (x,gs) <- streamliners ] - -- ] - return [ (nm, s) | s <- streamliners ] - _ -> noStreamliner + concatForM (mStatements model) $ \case + Declaration (FindOrGiven Find nm domain) -> do + let ref = Reference nm (Just (DeclNoRepr Find nm domain NoRegion)) + streamliners <- streamlinersForSingleVariable ref + -- traceM $ show $ vcat [ "Streamliners for --" <+> pretty statement + -- , vcat [ nest 4 (vcat (pretty x : map pretty gs)) | (x,gs) <- streamliners ] + -- ] + return [ (nm, s) | s <- streamliners ] + _ -> noStreamliner type StreamlinerGroup = String @@ -106,6 +105,9 @@ streamlinersForSingleVariable x = concatMapM ($ x) , onTuple 3 streamlinersForSingleVariable , onTuple 4 streamlinersForSingleVariable + , matrixByRowBucket streamlinersForSingleVariable + , matrixByColBucket streamlinersForSingleVariable + , matrixAll streamlinersForSingleVariable , matrixHalf streamlinersForSingleVariable , matrixAtMostOne streamlinersForSingleVariable @@ -184,7 +186,7 @@ intLowerHalf x = do DomainInt _ [RangeBounded _lower upper] -> do -- traceM $ show $ "DomainInt " <+> pretty (lower, upper) if typeUnify ty (TypeInt TagInt) - then mkStreamliner "IntLowHigh" [essence| &x < 1 + (&upper -1) /2 |] + then mkStreamliner "IntLowHigh" [essence| &x <= 1 + (&upper -1) /2 |] else noStreamliner _ -> noStreamliner @@ -355,6 +357,68 @@ matrixLessThanHalf innerStreamliner x = do _ -> noStreamliner +matrixByRowBucket :: + MonadFailDoc m => + NameGen m => + (?typeCheckerMode :: TypeCheckerMode) => + StreamlinerGen m -> StreamlinerGen m +matrixByRowBucket innerStreamliner x = do + dom <- expandDomainReference <$> domainOf x + case dom of + DomainMatrix (DomainInt _ [RangeBounded lb ub]) innerDom@(DomainMatrix _ DomainInt{}) -> do + let size = [essence| &ub - &lb + 1 |] + let bucketSize = [essence| &size / 10 |] + nm <- nextName "q" + let pat = Single nm + ref = Reference nm (Just (DeclNoRepr Find nm innerDom NoRegion)) + + liftMatrix (Reference n _) | n == nm = [essence| &x[&ref] |] + liftMatrix p = p + + innerConstraints <- transformBi liftMatrix <$> innerStreamliner ref + concatForM [0..9] $ \ (bucketInt :: Integer) -> let bucket = fromInt bucketInt in + forM innerConstraints $ \ (innerConstraint, grps) -> + attachGroup (("MatrixByRowBucket-" ++ show bucketInt) : grps) [essence| + forAll &pat : int(&lb + &bucket * &bucketSize .. min([&ub, &lb + (&bucket+1) * &bucketSize])) . &innerConstraint + |] + _ -> noStreamliner + + + +matrixByColBucket :: + MonadFailDoc m => + NameGen m => + (?typeCheckerMode :: TypeCheckerMode) => + StreamlinerGen m -> StreamlinerGen m +matrixByColBucket innerStreamliner x = do + dom <- expandDomainReference <$> domainOf x + case dom of + DomainMatrix outerIndex (DomainMatrix (DomainInt _ [RangeBounded lb ub]) innerDom) -> do + let size = [essence| &ub - &lb + 1 |] + let bucketSize = [essence| &size / 10 |] + + nmO <- nextName "q" + let patO = Single nmO + let refO = Reference nmO Nothing + + nm <- nextName "q" + let pat = Single nm + ref = Reference nm (Just (DeclNoRepr Find nm innerDom NoRegion)) + + liftMatrix (Reference n _) | n == nm = [essence| &x[&refO, &ref] |] + liftMatrix p = p + + innerConstraints <- transformBi liftMatrix <$> innerStreamliner ref + concatForM [0..9] $ \ (bucketInt :: Integer) -> let bucket = fromInt bucketInt in + forM innerConstraints $ \ (innerConstraint, grps) -> + attachGroup (("MatrixByColBucket-" ++ show bucketInt) : grps) [essence| + forAll &patO : &outerIndex . + forAll &pat : int(&lb + &bucket * &bucketSize .. min([&ub, &lb + (&bucket+1) * &bucketSize])) . + &innerConstraint + |] + _ -> noStreamliner + + ------------------------------------------------------------------------------ -- Sets and MSets ------------------------------------------------------------------------------ @@ -371,7 +435,7 @@ setAll innerStreamliner x = do case dom of DomainSet _ _ innerDom -> Just (innerDom, "SetCardinality") DomainMSet _ _ innerDom -> Just (innerDom, "MSetCardinality") - DomainRelation _ _ innerDoms -> Just ((DomainTuple innerDoms), "RelationCardinality") + DomainRelation _ _ innerDoms -> Just (DomainTuple innerDoms, "RelationCardinality") _ -> Nothing case minnerDom of Just (innerDom, newTag) -> do @@ -397,7 +461,7 @@ setAtMostOne innerStreamliner x = do case dom of DomainSet _ _ innerDom -> Just (innerDom, "SetCardinality") DomainMSet _ _ innerDom -> Just (innerDom, "MSetCardinality") - DomainRelation _ _ innerDoms -> Just ((DomainTuple innerDoms), "RelationCardinality") + DomainRelation _ _ innerDoms -> Just (DomainTuple innerDoms, "RelationCardinality") _ -> Nothing case minnerDom of Just (innerDom, newTag) -> do @@ -421,7 +485,7 @@ setHalf innerStreamliner x = do case dom of DomainSet _ _ innerDom -> Just (innerDom, "SetCardinality") DomainMSet _ _ innerDom -> Just (innerDom, "MSetCardinality") - DomainRelation _ _ innerDoms -> Just ((DomainTuple innerDoms), "RelationCardinality") + DomainRelation _ _ innerDoms -> Just (DomainTuple innerDoms, "RelationCardinality") _ -> Nothing case minnerDom of Just (innerDom, newTag) -> do @@ -446,7 +510,7 @@ setApproxHalf innerStreamliner x = do case dom of DomainSet _ _ innerDom -> Just (innerDom, "SetCardinality") DomainMSet _ _ innerDom -> Just (innerDom, "MSetCardinality") - DomainRelation _ _ innerDoms -> Just ((DomainTuple innerDoms), "RelationCardinality") + DomainRelation _ _ innerDoms -> Just (DomainTuple innerDoms, "RelationCardinality") _ -> Nothing case minnerDom of Just (innerDom, newTag) -> do @@ -474,7 +538,7 @@ setMoreThanHalf innerStreamliner x = do case dom of DomainSet _ _ innerDom -> Just (innerDom, "SetCardinality") DomainMSet _ _ innerDom -> Just (innerDom, "MSetCardinality") - DomainRelation _ _ innerDoms -> Just ((DomainTuple innerDoms), "RelationCardinality") + DomainRelation _ _ innerDoms -> Just (DomainTuple innerDoms, "RelationCardinality") _ -> Nothing case minnerDom of Just (innerDom, newTag) -> do @@ -501,7 +565,7 @@ setLessThanHalf innerStreamliner x = do case dom of DomainSet _ _ innerDom -> Just (innerDom, "SetCardinality") DomainMSet _ _ innerDom -> Just (innerDom, "MSetCardinality") - DomainRelation _ _ innerDoms -> Just ((DomainTuple innerDoms), "RelationCardinality") + DomainRelation _ _ innerDoms -> Just (DomainTuple innerDoms, "RelationCardinality") _ -> Nothing case minnerDom of Just (innerDom, newTag) -> do @@ -569,8 +633,8 @@ binRelAttributes x = do , ( BinRelAttr_Equivalence , [essence| |`&inner`| * |`&inner`| * |`&inner`| |] ) , ( BinRelAttr_PartialOrder , [essence| |`&inner`| * |`&inner`| * |`&inner`| |] ) ] - , softness <- [Nothing, Just 2, Just 4, Just 8, Just 16, Just 32] , let grp = show attr + , softness <- [Nothing, Just 2, Just 4, Just 8, Just 16, Just 32] ] _ -> noStreamliner diff --git a/src/Conjure/Rules/Horizontal/Sequence.hs b/src/Conjure/Rules/Horizontal/Sequence.hs index 3175631510..b8fc6b1040 100644 --- a/src/Conjure/Rules/Horizontal/Sequence.hs +++ b/src/Conjure/Rules/Horizontal/Sequence.hs @@ -379,16 +379,10 @@ rule_Restrict_Comprehension = "sequence-restrict-comprehension" `namedRule` theR theRule _ = na "rule_Restrict_Comprehension" --- | image(f,x) can be nasty for non-total sequences. --- 1. if f is a total sequence, it can readily be replaced by a set expression. --- 2.1. if f isn't total, and if the return type is right, it will always end up as a generator for a comprehension. --- a vertical rule is needed for such cases. --- 2.2. if the return type is not "right", i.e. it is a bool or an int, i.e. sth we cannot quantify over, --- the vertical rule is harder. rule_Image_Bool :: Rule rule_Image_Bool = "sequence-image-bool" `namedRule` theRule where - theRule Reference{} = na "rule_Image_Int" + theRule Reference{} = na "rule_Image_Bool" theRule p = do let onChildren @@ -402,6 +396,9 @@ rule_Image_Bool = "sequence-image-bool" `namedRule` theRule where case match opRestrict func of Nothing -> return () Just{} -> na "rule_Image_Bool" -- do not use this rule for restricted sequences + case match opTransform func of + Nothing -> na "rule_Image_Bool" -- only use this rule for transformed sequences + Just{} -> return () TypeSequence TypeBool <- typeOf func return (func, arg) case try of @@ -448,6 +445,9 @@ rule_Image_Int = "sequence-image-int" `namedRule` theRule where case match opRestrict func of Nothing -> return () Just{} -> na "rule_Image_Int" -- do not use this rule for restricted sequences + case match opTransform func of + Nothing -> na "rule_Image_Int" -- only use this rule for transformed sequences + Just{} -> return () TypeSequence (TypeInt _) <- typeOf func return (func, arg) case try of diff --git a/src/Conjure/UI.hs b/src/Conjure/UI.hs index d1f252ab12..57887ca4f9 100644 --- a/src/Conjure/UI.hs +++ b/src/Conjure/UI.hs @@ -1,7 +1,7 @@ {-# LANGUAGE DeriveDataTypeable, DeriveGeneric #-} {-# OPTIONS_GHC -fno-cse #-} -- stupid cmdargs -module Conjure.UI ( UI(..), OutputFormat(..), ui ) where +module Conjure.UI ( UI(..), OutputFormat(..), ui, versionLine ) where -- conjure import Conjure.Prelude @@ -100,6 +100,9 @@ data UI , responses :: String , responsesRepresentation :: String , solutionsInOneFile :: Bool + , runsolverCPUTimeLimit :: Maybe Int + , runsolverWallTimeLimit :: Maybe Int + , runsolverMemoryLimit :: Maybe Int -- flags related to logging , logLevel :: LogLevel , verboseTrail :: Bool @@ -749,6 +752,24 @@ ui = modes &= explicit &= help "Place all solutions in a single file instead of generating a separate file per solution.\n\ \Off by default." + , runsolverCPUTimeLimit + = def + &= name "runsolver-cpu-time-limit" + &= groupname "runsolver" + &= explicit + &= help "Use runsolver to limit total CPU time (in seconds)" + , runsolverWallTimeLimit + = def + &= name "runsolver-wall-time-limit" + &= groupname "runsolver" + &= explicit + &= help "Use runsolver to limit total elapsed time (in seconds)" + , runsolverMemoryLimit + = def + &= name "runsolver-memory-limit" + &= groupname "runsolver" + &= explicit + &= help "Use runsolver to limit total memory usage (Maximum RSS - in megabytes)." , logLevel = def &= name "log-level" @@ -1480,8 +1501,7 @@ ui = modes &= helpArg [explicit, name "help"] &= versionArg [explicit, name "version"] &= summary (unlines [ "Conjure: The Automated Constraint Modelling Tool" - , "Release version " ++ showVersion version - , "Repository version " ++ repositoryVersion + , versionLine ]) &= help "The command line interface of Conjure takes a command name as the first argument \ \followed by more arguments depending on the command.\n\ @@ -1489,3 +1509,5 @@ ui = modes \For details of a command, pass the --help flag after the command name.\n\ \For example: 'conjure translate-solution --help'" +versionLine :: String +versionLine = "Conjure v" ++ showVersion version ++ " (Repository version " ++ repositoryVersion ++ ")" diff --git a/src/Conjure/UI/MainHelper.hs b/src/Conjure/UI/MainHelper.hs index 3b57f1f312..0993321e28 100644 --- a/src/Conjure/UI/MainHelper.hs +++ b/src/Conjure/UI/MainHelper.hs @@ -19,7 +19,7 @@ import Conjure.UI.Split ( outputSplittedModels, removeUnusedDecls ) import Conjure.UI.VarSymBreaking ( outputVarSymBreaking ) import Conjure.UI.ParameterGenerator ( parameterGenerator ) import Conjure.UI.NormaliseQuantified ( normaliseQuantifiedVariables ) - +import Conjure.UI.SolveStats ( mkSolveStats ) import Conjure.Language.Name ( Name(..) ) import Conjure.Language.Definition ( Model(..), ModelInfo(..), Statement(..), Declaration(..), FindOrGiven(..) ) @@ -42,6 +42,7 @@ import Conjure.Language.AdHoc ( toSimpleJSON ) -- base +import Control.Exception ( IOException, handle ) import System.IO ( Handle, hSetBuffering, stdout, BufferMode(..), hPutStrLn, stderr ) import System.Environment ( getEnvironment ) import System.Info ( os ) @@ -55,9 +56,6 @@ import qualified Data.HashMap.Strict as M -- unordered-containers -- filepath import System.FilePath ( splitFileName, takeBaseName, (<.>) ) --- system-filepath --- import qualified Filesystem.Path as Sys ( FilePath ) - -- directory import System.Directory ( copyFile, findExecutable ) @@ -253,6 +251,7 @@ mainWithArgs Boost{..} = do boosted <- boost logLevel logRuleSuccesses model writeModel lineWidth outputFormat Nothing boosted mainWithArgs config@Solve{..} = do + liftIO $ createDirectoryIfMissing True outputDirectory -- some sanity checks (solverName, _smtLogicName) <- splitSolverName solver case lookup solverName solverExecutables of @@ -305,11 +304,7 @@ mainWithArgs config@Solve{..} = do if not (null useExistingModels) then do pp logLevel "Using existing models." - allEprimes <- getEprimes - let missingModels = useExistingModels \\ allEprimes - if null missingModels - then return useExistingModels - else userErr1 $ "Models not found:" <+> vcat (map pretty missingModels) + return useExistingModels else doIfNotCached -- start the show! ( sort (mStatements essenceM_beforeNR) , portfolio @@ -342,8 +337,12 @@ mainWithArgs config@Solve{..} = do conjuring eprimesParsed <- forM eprimes $ \ f -> do - p <- readModelInfoFromFile (outputDirectory f) - return (f, p) + p1 <- liftIO $ handle (\(_ :: IOException) -> return Nothing) (Just <$> readModelInfoFromFile (outputDirectory f)) + p2 <- liftIO $ handle (\(_ :: IOException) -> return Nothing) (Just <$> readModelInfoFromFile f) + case (p1, p2) of + (Just p, _) -> return (outputDirectory f, p) + (_, Just p) -> return (f, p) + _ -> userErr1 $ "Model not found:" <+> pretty f msolutions <- liftIO $ savileRows eprimesParsed essenceParamsParsed case msolutions of @@ -450,11 +449,11 @@ mainWithArgs config@Solve{..} = do n <- mainWithArgs_Modelling "" modelling Nothing S.empty eprimes <- getEprimes when (null eprimes) $ bug "Failed to generate models." - if (S.size n == 1) + if S.size n == 1 then pp logLevel $ "Generated models:" <+> prettyList id "," eprimes else pp logLevel $ "Generated" <+> pretty (S.size n) <+> "models:" <+> prettyList id "," eprimes pp logLevel $ "Saved under:" <+> pretty outputDirectory - return eprimes + return [ outputDirectory f | f <- eprimes ] getEprimes :: m [FilePath] getEprimes = sort . filter (".eprime" `isSuffixOf`) <$> liftIO (getDirectoryContents outputDirectory) @@ -848,16 +847,32 @@ savileRowNoParam :: ) ]) savileRowNoParam ui@Solve{..} (modelPath, eprimeModel) = sh $ errExit False $ do pp logLevel $ hsep ["Savile Row:", pretty modelPath] - let outBase = dropExtension modelPath + let outBase = (dropExtension . snd . splitFileName) modelPath srArgs <- liftIO $ srMkArgs ui outBase modelPath let tr = translateSolution eprimeModel def - when (logLevel >= LogDebug) $ do - liftIO $ putStrLn "Using the following options for Savile Row:" - liftIO $ putStrLn $ " savilerow " ++ unwords (map (quoteMultiWord . textToString) srArgs) - (stdoutSR, solutions) <- partitionEithers <$> runHandle savilerowScriptName srArgs - (liftIO . srStdoutHandler - (outBase, modelPath, "", ui) - tr (1::Int)) + let handler = liftIO . srStdoutHandler + (outBase, modelPath, "", ui) + tr (1::Int) + let runsolverArgs = maybe [] (\ limit -> ["-C", show limit]) runsolverCPUTimeLimit ++ + maybe [] (\ limit -> ["-W", show limit]) runsolverWallTimeLimit ++ + maybe [] (\ limit -> ["-R", show limit]) runsolverMemoryLimit ++ + ["--quiet", "-v", outputDirectory outBase ++ ".runsolver-info"] + (stdoutSR, solutions) <- partitionEithers <$> + case (runsolverCPUTimeLimit, runsolverWallTimeLimit, runsolverMemoryLimit) of + (Nothing, Nothing, Nothing) -> do + when (logLevel >= LogDebug) $ do + liftIO $ putStrLn "Using the following options for Savile Row:" + liftIO $ putStrLn $ " savilerow " ++ unwords (map (quoteMultiWord . textToString) srArgs) + runHandle savilerowScriptName srArgs handler + _ -> + if os /= "linux" + then return [Left "runsolver is only supported on linux"] + else do + when (logLevel >= LogDebug) $ do + liftIO $ putStrLn "Using the following options for Savile Row:" + liftIO $ putStrLn $ " runsolver " ++ unwords (map quoteMultiWord runsolverArgs) + ++ " savilerow " ++ unwords (map (quoteMultiWord . textToString) srArgs) + runHandle "runsolver" (map stringToText runsolverArgs ++ [stringToText savilerowScriptName] ++ srArgs) handler srCleanUp outBase ui (stringToText $ unlines stdoutSR) solutions savileRowNoParam _ _ = bug "savileRowNoParam" @@ -875,7 +890,7 @@ savileRowWithParams :: ) ]) savileRowWithParams ui@Solve{..} (modelPath, eprimeModel) (paramPath, essenceParam) = sh $ errExit False $ do pp logLevel $ hsep ["Savile Row:", pretty modelPath, pretty paramPath] - let outBase = dropExtension modelPath ++ "-" ++ dropDirs (dropExtension paramPath) + let outBase = (dropExtension . snd . splitFileName) modelPath ++ "-" ++ dropDirs (dropExtension paramPath) let -- this is a bit tricky. -- we want to preserve user-erors, and not raise them as errors using IO.fail @@ -892,13 +907,30 @@ savileRowWithParams ui@Solve{..} (modelPath, eprimeModel) (paramPath, essencePar : stringToText (outputDirectory outBase ++ ".eprime-param") : srArgsBase let tr = translateSolution eprimeModel essenceParam - when (logLevel >= LogDebug) $ do - liftIO $ putStrLn "Using the following options for Savile Row:" - liftIO $ putStrLn $ " savilerow " ++ unwords (map (quoteMultiWord . textToString) srArgs) - (stdoutSR, solutions) <- partitionEithers <$> runHandle savilerowScriptName srArgs - (liftIO . srStdoutHandler - (outBase, modelPath, paramPath, ui) - tr (1::Int)) + let handler = liftIO . srStdoutHandler + (outBase, modelPath, paramPath, ui) + tr (1::Int) + let runsolverArgs = maybe [] (\ limit -> ["-C", show limit]) runsolverCPUTimeLimit ++ + maybe [] (\ limit -> ["-W", show limit]) runsolverWallTimeLimit ++ + maybe [] (\ limit -> ["-R", show limit]) runsolverMemoryLimit ++ + ["--quiet", "-v", outputDirectory outBase ++ ".runsolver-info"] + (stdoutSR, solutions) <- partitionEithers <$> + case (runsolverCPUTimeLimit, runsolverWallTimeLimit, runsolverMemoryLimit) of + (Nothing, Nothing, Nothing) -> do + when (logLevel >= LogDebug) $ do + liftIO $ putStrLn "Using the following options for Savile Row:" + liftIO $ putStrLn $ " savilerow " ++ unwords (map (quoteMultiWord . textToString) srArgs) + runHandle savilerowScriptName srArgs handler + _ -> + if os /= "linux" + then return [Left "runsolver is only supported on linux"] + else do + when (logLevel >= LogDebug) $ do + liftIO $ putStrLn "Using the following options for Savile Row:" + liftIO $ putStrLn $ " runsolver " ++ unwords (map quoteMultiWord runsolverArgs) + ++ " savilerow " ++ unwords (map (quoteMultiWord . textToString) srArgs) + runHandle "runsolver" (map stringToText runsolverArgs ++ [stringToText savilerowScriptName] ++ srArgs) handler + srCleanUp outBase ui (stringToText $ unlines stdoutSR) solutions savileRowWithParams _ _ _ = bug "savileRowWithParams" @@ -965,7 +997,7 @@ splitSolverName solver = do srMkArgs :: UI -> FilePath -> FilePath -> IO [Text] srMkArgs Solve{..} outBase modelPath = do let genericOpts = - [ "-in-eprime" , stringToText $ outputDirectory modelPath + [ "-in-eprime" , stringToText modelPath , "-out-minion" , stringToText $ outputDirectory outBase ++ ".eprime-minion" , "-out-sat" , stringToText $ outputDirectory outBase ++ ".eprime-dimacs" , "-out-smt" , stringToText $ outputDirectory outBase ++ ".eprime-smt" @@ -1147,14 +1179,15 @@ srStdoutHandler _ _ _ _ = bug "srStdoutHandler" srCleanUp :: FilePath -> UI -> Text -> [sols] -> Sh (Either [Doc] [sols]) -srCleanUp outBase Solve{..} stdoutSR solutions = do +srCleanUp outBase ui@Solve{..} stdoutSR solutions = do + + let mkFilename ext = outputDirectory outBase ++ ext -- closing the array in the all solutions json file case outputFormat of JSON -> case solutionsInOneFile of False -> return () True -> do - let mkFilename ext = outputDirectory outBase ++ ext let filenameEssenceSolJSON = mkFilename ".solutions.json" case solutions of [] -> liftIO $ writeFile filenameEssenceSolJSON "[]\n" @@ -1164,6 +1197,16 @@ srCleanUp outBase Solve{..} stdoutSR solutions = do stderrSR <- lastStderr exitCodeSR <- lastExitCode let combinedSR = T.unlines [stdoutSR, stderrSR] + + liftIO $ do + let savilerowInfoFilename = mkFilename ".eprime-info" + let runsolverInfoFilename = mkFilename ".runsolver-info" + let statsFilename = mkFilename ".stats.json" + savilerowInfoContent <- liftIO $ readFileIfExists savilerowInfoFilename + runsolverInfoContent <- liftIO $ readFileIfExists runsolverInfoFilename + stats <- mkSolveStats ui (exitCodeSR, stdoutSR, stderrSR) (fromMaybe "" savilerowInfoContent) (fromMaybe "" runsolverInfoContent) + writeFile statsFilename (render lineWidth (toJSON stats)) + if | T.isInfixOf "Savile Row timed out." combinedSR -> return (Left ["Savile Row timed out."]) | T.isInfixOf "where false" combinedSR -> diff --git a/src/Conjure/UI/SolveStats.hs b/src/Conjure/UI/SolveStats.hs new file mode 100644 index 0000000000..f94eea3d6e --- /dev/null +++ b/src/Conjure/UI/SolveStats.hs @@ -0,0 +1,140 @@ +{-# LANGUAGE DeriveDataTypeable #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE RecordWildCards #-} + +module Conjure.UI.SolveStats (mkSolveStats, SolveStats (..), SolveStatus (..)) where + +import Conjure.Bug +import Conjure.Prelude +import Conjure.UI (UI (..), versionLine) +import Data.HashMap.Strict qualified as M -- unordered-containers +import Data.Text qualified as T (isInfixOf, null, unlines) -- text +import Data.Time (UTCTime, getCurrentTime) -- time +import Network.HostName (getHostName) -- hostname +import Shelly (run) -- shelly + +data SolveStats = SolveStats + { status :: SolveStatus, + totalTime :: Maybe Double, + savilerowInfo :: M.HashMap String String, + runsolverInfo :: M.HashMap String String, + essence :: FilePath, + essenceParams :: [FilePath], + useExistingModels :: [FilePath], + savilerowOptions :: [String], + solverOptions :: [String], + solver :: String, + computer :: String, + timestamp :: UTCTime, + conjureVersion :: String, + savilerowVersion :: String, + savilerowLogs :: SavileRowLogs + } + deriving (Eq, Ord, Show, Data, Typeable, Generic) + +instance Hashable SolveStats + +instance ToJSON SolveStats where toJSON = genericToJSON jsonOptions + +instance FromJSON SolveStats where parseJSON = genericParseJSON jsonOptions + +-- OK: solved, can be sat or unsat. +-- Invalid: instance is not valid. +-- TimeOut/MemOut: what they sound like. +-- Error: could be a bug, but could also be to do with a very large encoding. +data SolveStatus = OK | Invalid | TimeOut | MemOut | Error + deriving (Eq, Ord, Show, Data, Typeable, Generic) + +instance Hashable SolveStatus + +instance ToJSON SolveStatus where toJSON = genericToJSON jsonOptions + +instance FromJSON SolveStatus where parseJSON = genericParseJSON jsonOptions + +data SavileRowLogs = SavileRowLogs + { exitCode :: Int, + stderr :: Maybe [String], + stdout :: Maybe [String] + } + deriving (Eq, Ord, Show, Data, Typeable, Generic) + +instance Hashable SavileRowLogs + +instance ToJSON SavileRowLogs where toJSON = genericToJSON jsonOptions + +instance FromJSON SavileRowLogs where parseJSON = genericParseJSON jsonOptions + +mkSolveStats :: UI -> (Int, Text, Text) -> String -> String -> IO SolveStats +mkSolveStats Solve {..} (exitCodeSR, stdoutSR, stderrSR) savilerowInfoText runsolverInfoText = do + let combinedSR = T.unlines [stdoutSR, stderrSR] + + savilerowInfo = M.fromList [(k, v) | [k, v] <- map (splitOn ":") (lines savilerowInfoText)] + + runsolverInfo = M.fromList [(k, v) | [k, v] <- map (splitOn "=") (lines runsolverInfoText)] + + status + | or + [ T.isInfixOf msg combinedSR + | msg <- + [ "type error: undefined identifier", + "MiniZinc error: Memory violation detected", -- minizinc + "Check failed: ParseFlatzincFile", + "parse error: unexpected end-of-file after parsing number of clauses", -- kissat + "error: Cannot open file", + "kissat: error: can not read", -- kissat + "kissat: fatal error: maximum arena capacity", -- kissat + "Error: syntax error, unexpected ]]", -- cplex + "*** Check failure stack trace: ***", -- or-tools + "Error: evaluation error: Index set mismatch.", + "Savile Row killed by: java.lang.AssertionError", + "java.lang.ClassCastException", + "ERROR: File not found", -- savilerow + "ERROR: Failed when writing SAT encoding to file." -- savilerow + ] + ] = + Error + | or + [ T.isInfixOf msg combinedSR + | msg <- + [ "java.lang.OutOfMemoryError", + "ERROR: Out of Memory", + "Maximum memory exceeded" -- for when runsolver prints this message but won't set MEMOUT=true for some reason + ] + ] = + MemOut + | or + [ T.isInfixOf msg combinedSR + | msg <- + [ "Savile Row timed out.", + "time out: time limit reached", + "Received SIGTERM or SIGINT, killing child" -- for when runsolver prints this message but won't set MEMOUT=true or TIMEOUT=true for some reason + ] + ] = + TimeOut + | T.isInfixOf "ERROR: In statement: where false" combinedSR = Invalid + | M.lookup "MEMOUT" runsolverInfo == Just "true" = MemOut + | M.lookup "TIMEOUT" runsolverInfo == Just "true" = TimeOut + | M.lookup "SavileRowTimeOut" savilerowInfo == Just "1" = TimeOut + | M.lookup "SavileRowClauseOut" savilerowInfo == Just "1" = TimeOut + | M.lookup "SolverTimeOut" savilerowInfo == Just "1" = TimeOut + | exitCodeSR /= 0 = Error + | otherwise = OK + + totalTime + | Just srTotalTime <- M.lookup "SavileRowTotalTime" savilerowInfo >>= readMay, + Just solverTotalTime <- M.lookup "SolverTotalTime" savilerowInfo >>= readMay = + Just (srTotalTime + solverTotalTime) + | otherwise = Nothing + + computer <- getHostName + timestamp <- getCurrentTime + let conjureVersion = versionLine + savilerowVersion <- head . lines . textToString <$> sh (run "savilerow" ["-help"]) + let savilerowLogs = + SavileRowLogs + { exitCode = exitCodeSR, + stdout = if T.null stdoutSR then Nothing else Just (lines (textToString stdoutSR)), + stderr = if T.null stderrSR then Nothing else Just (lines (textToString stderrSR)) + } + return SolveStats {..} +mkSolveStats _ _ _ _ = bug "mkSolveStats" diff --git a/tests/allsolvers/stdout.expected b/tests/allsolvers/stdout.expected index 96130c07eb..b70ac25369 100644 --- a/tests/allsolvers/stdout.expected +++ b/tests/allsolvers/stdout.expected @@ -2,7 +2,7 @@ default, minion Generating models for test.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: test.solution @@ -11,7 +11,7 @@ Copying solution to: test.solution ======================================== minion Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: test.solution @@ -20,7 +20,7 @@ Copying solution to: test.solution ======================================== chuffed Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: chuffed Copying solution to: test.solution @@ -29,7 +29,7 @@ Copying solution to: test.solution ======================================== or-tools Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: or-tools Copying solution to: test.solution @@ -38,7 +38,7 @@ Copying solution to: test.solution ======================================== glucose Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: glucose Copying solution to: test.solution @@ -47,7 +47,7 @@ Copying solution to: test.solution ======================================== glucose-syrup Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: glucose-syrup Copying solution to: test.solution @@ -56,7 +56,7 @@ Copying solution to: test.solution ======================================== lingeling Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: lingeling Copying solution to: test.solution @@ -65,7 +65,7 @@ Copying solution to: test.solution ======================================== plingeling Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: plingeling Copying solution to: test.solution @@ -74,7 +74,7 @@ Copying solution to: test.solution ======================================== treengeling Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: treengeling Copying solution to: test.solution @@ -83,7 +83,7 @@ Copying solution to: test.solution ======================================== cadical Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: cadical Copying solution to: test.solution @@ -92,7 +92,7 @@ Copying solution to: test.solution ======================================== bc_minisat_all --number-of-solutions=all Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: bc_minisat_all Copying solution to: test-000001.solution @@ -107,7 +107,7 @@ Copying solution to: test-000007.solution ======================================== nbc_minisat_all --number-of-solutions=all Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: nbc_minisat_all Copying solution to: test-000001.solution @@ -124,7 +124,7 @@ open-wbo Generating models for testo.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: open-wbo Copying solution to: testo.solution @@ -135,7 +135,7 @@ boolector Generating models for test.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: boolector Copying solution to: test.solution @@ -144,7 +144,7 @@ Copying solution to: test.solution ======================================== boolector-bv Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: boolector-bv Copying solution to: test.solution @@ -153,7 +153,7 @@ Copying solution to: test.solution ======================================== yices Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: yices Copying solution to: test.solution @@ -162,7 +162,7 @@ Copying solution to: test.solution ======================================== yices-bv Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: yices-bv Copying solution to: test.solution @@ -171,7 +171,7 @@ Copying solution to: test.solution ======================================== yices-lia Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: yices-lia Copying solution to: test.solution @@ -180,7 +180,7 @@ Copying solution to: test.solution ======================================== yices-idl Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: yices-idl Copying solution to: test.solution @@ -189,7 +189,7 @@ Copying solution to: test.solution ======================================== z3 Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: z3 Copying solution to: test.solution @@ -198,7 +198,7 @@ Copying solution to: test.solution ======================================== z3-bv Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: z3-bv Copying solution to: test.solution @@ -207,7 +207,7 @@ Copying solution to: test.solution ======================================== z3-lia Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: z3-lia Copying solution to: test.solution @@ -216,7 +216,7 @@ Copying solution to: test.solution ======================================== z3-nia Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: z3-nia Copying solution to: test.solution @@ -225,7 +225,7 @@ Copying solution to: test.solution ======================================== z3-idl Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: z3-idl No solutions found. diff --git a/tests/custom/STARIS_2022/basic/bool-xor/stdout.expected b/tests/custom/STARIS_2022/basic/bool-xor/stdout.expected index cecd8f09ac..38e690cad8 100644 --- a/tests/custom/STARIS_2022/basic/bool-xor/stdout.expected +++ b/tests/custom/STARIS_2022/basic/bool-xor/stdout.expected @@ -1,7 +1,7 @@ Generating models for xor.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: xor.solution diff --git a/tests/custom/STARIS_2022/basic/decision-where-error/stdout.expected b/tests/custom/STARIS_2022/basic/decision-where-error/stdout.expected index fd92b9ab16..899dc467c0 100644 --- a/tests/custom/STARIS_2022/basic/decision-where-error/stdout.expected +++ b/tests/custom/STARIS_2022/basic/decision-where-error/stdout.expected @@ -1,4 +1,4 @@ Generating models for decision-where.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime diff --git a/tests/custom/STARIS_2022/basic/enum-directions/stdout.expected b/tests/custom/STARIS_2022/basic/enum-directions/stdout.expected index ae38be1f00..3c151f2d59 100644 --- a/tests/custom/STARIS_2022/basic/enum-directions/stdout.expected +++ b/tests/custom/STARIS_2022/basic/enum-directions/stdout.expected @@ -1,7 +1,7 @@ Generating models for directions.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: directions.solution diff --git a/tests/custom/STARIS_2022/basic/enum-operators/pred-basic/stdout.expected b/tests/custom/STARIS_2022/basic/enum-operators/pred-basic/stdout.expected index 0121d325b9..79b13629b6 100644 --- a/tests/custom/STARIS_2022/basic/enum-operators/pred-basic/stdout.expected +++ b/tests/custom/STARIS_2022/basic/enum-operators/pred-basic/stdout.expected @@ -1,7 +1,7 @@ Generating models for pred-basic.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: pred-basic.solution diff --git a/tests/custom/STARIS_2022/basic/enum-operators/succ-basic/stdout.expected b/tests/custom/STARIS_2022/basic/enum-operators/succ-basic/stdout.expected index 9b0e8549ba..2750edcb9e 100644 --- a/tests/custom/STARIS_2022/basic/enum-operators/succ-basic/stdout.expected +++ b/tests/custom/STARIS_2022/basic/enum-operators/succ-basic/stdout.expected @@ -1,7 +1,7 @@ Generating models for succ-basic.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: succ-basic.solution diff --git a/tests/custom/STARIS_2022/basic/factor/stdout.expected b/tests/custom/STARIS_2022/basic/factor/stdout.expected index c0a11665f9..5f726de4c7 100644 --- a/tests/custom/STARIS_2022/basic/factor/stdout.expected +++ b/tests/custom/STARIS_2022/basic/factor/stdout.expected @@ -1,7 +1,7 @@ Generating models for factor.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: factor.solution diff --git a/tests/custom/STARIS_2022/basic/greatest-common-factor/stdout.expected b/tests/custom/STARIS_2022/basic/greatest-common-factor/stdout.expected index 18fc2eaff0..958e52e860 100644 --- a/tests/custom/STARIS_2022/basic/greatest-common-factor/stdout.expected +++ b/tests/custom/STARIS_2022/basic/greatest-common-factor/stdout.expected @@ -1,7 +1,7 @@ Generating models for gcf.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime inputs.param +Savile Row: conjure-output/model000001.eprime inputs.param Running minion for domain filtering. Running solver: minion Copying solution to: gcf-inputs.solution diff --git a/tests/custom/STARIS_2022/basic/letting-arithmetic/stdout.expected b/tests/custom/STARIS_2022/basic/letting-arithmetic/stdout.expected index 1639bc511f..a16067d591 100644 --- a/tests/custom/STARIS_2022/basic/letting-arithmetic/stdout.expected +++ b/tests/custom/STARIS_2022/basic/letting-arithmetic/stdout.expected @@ -1,7 +1,7 @@ Generating models for letting.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: letting.solution diff --git a/tests/custom/STARIS_2022/basic/list-operations/exists/stdout.expected b/tests/custom/STARIS_2022/basic/list-operations/exists/stdout.expected index ca2c0f6526..c049ed2217 100644 --- a/tests/custom/STARIS_2022/basic/list-operations/exists/stdout.expected +++ b/tests/custom/STARIS_2022/basic/list-operations/exists/stdout.expected @@ -1,7 +1,7 @@ Generating models for exists.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: exists.solution diff --git a/tests/custom/STARIS_2022/basic/list-operations/forAll/stdout.expected b/tests/custom/STARIS_2022/basic/list-operations/forAll/stdout.expected index 0b9e68c74b..9978c3e0ba 100644 --- a/tests/custom/STARIS_2022/basic/list-operations/forAll/stdout.expected +++ b/tests/custom/STARIS_2022/basic/list-operations/forAll/stdout.expected @@ -1,7 +1,7 @@ Generating models for forAll.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: forAll.solution diff --git a/tests/custom/STARIS_2022/basic/list-operations/sum-basic/stdout.expected b/tests/custom/STARIS_2022/basic/list-operations/sum-basic/stdout.expected index 14eb33e2c0..1c48ee1e8e 100644 --- a/tests/custom/STARIS_2022/basic/list-operations/sum-basic/stdout.expected +++ b/tests/custom/STARIS_2022/basic/list-operations/sum-basic/stdout.expected @@ -1,7 +1,7 @@ Generating models for sum.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: sum.solution diff --git a/tests/custom/STARIS_2022/basic/list-operations/sum-matrix/stdout.expected b/tests/custom/STARIS_2022/basic/list-operations/sum-matrix/stdout.expected index 6fb3400ba0..f07a5c54d9 100644 --- a/tests/custom/STARIS_2022/basic/list-operations/sum-matrix/stdout.expected +++ b/tests/custom/STARIS_2022/basic/list-operations/sum-matrix/stdout.expected @@ -1,7 +1,7 @@ Generating models for sum-matrix.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: sum-matrix.solution diff --git a/tests/custom/STARIS_2022/basic/matrices/allDiff-basic/stdout.expected b/tests/custom/STARIS_2022/basic/matrices/allDiff-basic/stdout.expected index 8bd90c82ac..b354d2ff08 100644 --- a/tests/custom/STARIS_2022/basic/matrices/allDiff-basic/stdout.expected +++ b/tests/custom/STARIS_2022/basic/matrices/allDiff-basic/stdout.expected @@ -1,7 +1,7 @@ Generating models for allDiff.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: allDiff.solution diff --git a/tests/custom/STARIS_2022/basic/matrices/alldifferent_except/stdout.expected b/tests/custom/STARIS_2022/basic/matrices/alldifferent_except/stdout.expected index c253074dae..979333c57d 100644 --- a/tests/custom/STARIS_2022/basic/matrices/alldifferent_except/stdout.expected +++ b/tests/custom/STARIS_2022/basic/matrices/alldifferent_except/stdout.expected @@ -1,7 +1,7 @@ Generating models for alldifferent_except.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: alldifferent_except.solution diff --git a/tests/custom/STARIS_2022/basic/matrices/flatten/stdout.expected b/tests/custom/STARIS_2022/basic/matrices/flatten/stdout.expected index cc378a2a41..ff99da81a9 100644 --- a/tests/custom/STARIS_2022/basic/matrices/flatten/stdout.expected +++ b/tests/custom/STARIS_2022/basic/matrices/flatten/stdout.expected @@ -1,7 +1,7 @@ Generating models for flatten.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: flatten.solution diff --git a/tests/custom/STARIS_2022/basic/matrices/matrix-basic/stdout.expected b/tests/custom/STARIS_2022/basic/matrices/matrix-basic/stdout.expected index 15066294cf..3ebf60e43f 100644 --- a/tests/custom/STARIS_2022/basic/matrices/matrix-basic/stdout.expected +++ b/tests/custom/STARIS_2022/basic/matrices/matrix-basic/stdout.expected @@ -1,7 +1,7 @@ Generating models for matrix-basic.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: matrix-basic.solution diff --git a/tests/custom/STARIS_2022/basic/matrices/matrix-bool/stdout.expected b/tests/custom/STARIS_2022/basic/matrices/matrix-bool/stdout.expected index bdd65965bf..843ccfaf2c 100644 --- a/tests/custom/STARIS_2022/basic/matrices/matrix-bool/stdout.expected +++ b/tests/custom/STARIS_2022/basic/matrices/matrix-bool/stdout.expected @@ -1,7 +1,7 @@ Generating models for matrix-bool.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: matrix-bool.solution diff --git a/tests/custom/STARIS_2022/basic/matrices/matrix-flatten/stdout.expected b/tests/custom/STARIS_2022/basic/matrices/matrix-flatten/stdout.expected index fa1a85caf6..8e7ae83799 100644 --- a/tests/custom/STARIS_2022/basic/matrices/matrix-flatten/stdout.expected +++ b/tests/custom/STARIS_2022/basic/matrices/matrix-flatten/stdout.expected @@ -1,7 +1,7 @@ Generating models for matrix-flatten.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: matrix-flatten.solution diff --git a/tests/custom/STARIS_2022/basic/maximising/stdout.expected b/tests/custom/STARIS_2022/basic/maximising/stdout.expected index e7e37ffc50..d219cc745b 100644 --- a/tests/custom/STARIS_2022/basic/maximising/stdout.expected +++ b/tests/custom/STARIS_2022/basic/maximising/stdout.expected @@ -1,7 +1,7 @@ Generating models for max.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: max.solution diff --git a/tests/custom/STARIS_2022/basic/modulus/stdout.expected b/tests/custom/STARIS_2022/basic/modulus/stdout.expected index 3da7a3c7d6..3a5e4bd260 100644 --- a/tests/custom/STARIS_2022/basic/modulus/stdout.expected +++ b/tests/custom/STARIS_2022/basic/modulus/stdout.expected @@ -1,7 +1,7 @@ Generating models for mod01.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: mod01-000001.solution diff --git a/tests/custom/STARIS_2022/basic/multiset-operators/hist-basic/stdout.expected b/tests/custom/STARIS_2022/basic/multiset-operators/hist-basic/stdout.expected index 98655b98ba..8f0dce0c0c 100644 --- a/tests/custom/STARIS_2022/basic/multiset-operators/hist-basic/stdout.expected +++ b/tests/custom/STARIS_2022/basic/multiset-operators/hist-basic/stdout.expected @@ -1,7 +1,7 @@ Generating models for hist.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: hist.solution diff --git a/tests/custom/STARIS_2022/basic/multiset-operators/max/stdout.expected b/tests/custom/STARIS_2022/basic/multiset-operators/max/stdout.expected index 599f91a351..0a35f57637 100644 --- a/tests/custom/STARIS_2022/basic/multiset-operators/max/stdout.expected +++ b/tests/custom/STARIS_2022/basic/multiset-operators/max/stdout.expected @@ -1,7 +1,7 @@ Generating models for max.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: max.solution diff --git a/tests/custom/STARIS_2022/basic/multiset-operators/min/stdout.expected b/tests/custom/STARIS_2022/basic/multiset-operators/min/stdout.expected index 369edf4d41..b44e3fbfe6 100644 --- a/tests/custom/STARIS_2022/basic/multiset-operators/min/stdout.expected +++ b/tests/custom/STARIS_2022/basic/multiset-operators/min/stdout.expected @@ -1,7 +1,7 @@ Generating models for min.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: min.solution diff --git a/tests/custom/STARIS_2022/basic/multiset-operators/multiset-basic/stdout.expected b/tests/custom/STARIS_2022/basic/multiset-operators/multiset-basic/stdout.expected index 4665e2dc4b..30faad3560 100644 --- a/tests/custom/STARIS_2022/basic/multiset-operators/multiset-basic/stdout.expected +++ b/tests/custom/STARIS_2022/basic/multiset-operators/multiset-basic/stdout.expected @@ -1,7 +1,7 @@ Generating models for multiset-basic.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: multiset-basic.solution diff --git a/tests/custom/STARIS_2022/basic/parameter-error/stdout.expected b/tests/custom/STARIS_2022/basic/parameter-error/stdout.expected index a8a271d48d..8a90b616ee 100644 --- a/tests/custom/STARIS_2022/basic/parameter-error/stdout.expected +++ b/tests/custom/STARIS_2022/basic/parameter-error/stdout.expected @@ -1,4 +1,4 @@ Generating models for parameter-error.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime input.param +Savile Row: conjure-output/model000001.eprime input.param diff --git a/tests/custom/STARIS_2022/basic/parameter-simple/stdout.expected b/tests/custom/STARIS_2022/basic/parameter-simple/stdout.expected index d75019b85c..011c4ac0d6 100644 --- a/tests/custom/STARIS_2022/basic/parameter-simple/stdout.expected +++ b/tests/custom/STARIS_2022/basic/parameter-simple/stdout.expected @@ -1,7 +1,7 @@ Generating models for simple.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime parameter.param +Savile Row: conjure-output/model000001.eprime parameter.param Running minion for domain filtering. Running solver: minion Copying solution to: simple-parameter.solution diff --git a/tests/custom/STARIS_2022/basic/partitions/partition-01/stdout.expected b/tests/custom/STARIS_2022/basic/partitions/partition-01/stdout.expected index be0fa8b941..a178b32e7f 100644 --- a/tests/custom/STARIS_2022/basic/partitions/partition-01/stdout.expected +++ b/tests/custom/STARIS_2022/basic/partitions/partition-01/stdout.expected @@ -1,7 +1,7 @@ Generating models for apart.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: apart.solution diff --git a/tests/custom/STARIS_2022/basic/partitions/partition-02/stdout.expected b/tests/custom/STARIS_2022/basic/partitions/partition-02/stdout.expected index 220e773770..c6f1d1c8a7 100644 --- a/tests/custom/STARIS_2022/basic/partitions/partition-02/stdout.expected +++ b/tests/custom/STARIS_2022/basic/partitions/partition-02/stdout.expected @@ -1,7 +1,7 @@ Generating models for union.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: union.solution diff --git a/tests/custom/STARIS_2022/basic/partitions/partition-03/stdout.expected b/tests/custom/STARIS_2022/basic/partitions/partition-03/stdout.expected index e63fb05943..948e7351f8 100644 --- a/tests/custom/STARIS_2022/basic/partitions/partition-03/stdout.expected +++ b/tests/custom/STARIS_2022/basic/partitions/partition-03/stdout.expected @@ -1,7 +1,7 @@ Generating models for union-nosolution.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion No solutions found. diff --git a/tests/custom/STARIS_2022/basic/record-simple/stdout.expected b/tests/custom/STARIS_2022/basic/record-simple/stdout.expected index 2853a3f54d..36b1309681 100644 --- a/tests/custom/STARIS_2022/basic/record-simple/stdout.expected +++ b/tests/custom/STARIS_2022/basic/record-simple/stdout.expected @@ -1,7 +1,7 @@ Generating models for record.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: record.solution diff --git a/tests/custom/STARIS_2022/basic/set-comprehension/stdout.expected b/tests/custom/STARIS_2022/basic/set-comprehension/stdout.expected index 5818e72ca0..2822b4ea0f 100644 --- a/tests/custom/STARIS_2022/basic/set-comprehension/stdout.expected +++ b/tests/custom/STARIS_2022/basic/set-comprehension/stdout.expected @@ -1,7 +1,7 @@ Generating models for set.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: set.solution diff --git a/tests/custom/STARIS_2022/basic/set-operators/basic-set/stdout.expected b/tests/custom/STARIS_2022/basic/set-operators/basic-set/stdout.expected index f947561e91..b6c8a4d19f 100644 --- a/tests/custom/STARIS_2022/basic/set-operators/basic-set/stdout.expected +++ b/tests/custom/STARIS_2022/basic/set-operators/basic-set/stdout.expected @@ -1,7 +1,7 @@ Generating models for basic-set.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: basic-set.solution diff --git a/tests/custom/STARIS_2022/basic/set-operators/in-type-error-01/stdout.expected b/tests/custom/STARIS_2022/basic/set-operators/in-type-error-01/stdout.expected index 41438e7489..a0bda7ebd9 100644 --- a/tests/custom/STARIS_2022/basic/set-operators/in-type-error-01/stdout.expected +++ b/tests/custom/STARIS_2022/basic/set-operators/in-type-error-01/stdout.expected @@ -1,4 +1,4 @@ Generating models for in-type-error.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime diff --git a/tests/custom/STARIS_2022/basic/set-with-attributes/stdout.expected b/tests/custom/STARIS_2022/basic/set-with-attributes/stdout.expected index 5818e72ca0..2822b4ea0f 100644 --- a/tests/custom/STARIS_2022/basic/set-with-attributes/stdout.expected +++ b/tests/custom/STARIS_2022/basic/set-with-attributes/stdout.expected @@ -1,7 +1,7 @@ Generating models for set.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: set.solution diff --git a/tests/custom/STARIS_2022/basic/set01/stdout.expected b/tests/custom/STARIS_2022/basic/set01/stdout.expected index cc58344647..683f0a0dd8 100644 --- a/tests/custom/STARIS_2022/basic/set01/stdout.expected +++ b/tests/custom/STARIS_2022/basic/set01/stdout.expected @@ -1,7 +1,7 @@ Generating models for set.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: set.solution diff --git a/tests/custom/STARIS_2022/basic/simple-assignment/stdout.expected b/tests/custom/STARIS_2022/basic/simple-assignment/stdout.expected index 72d1c984f8..789ce3de6e 100644 --- a/tests/custom/STARIS_2022/basic/simple-assignment/stdout.expected +++ b/tests/custom/STARIS_2022/basic/simple-assignment/stdout.expected @@ -1,7 +1,7 @@ Generating models for simple.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: simple.solution diff --git a/tests/custom/STARIS_2022/basic/such-that/stdout.expected b/tests/custom/STARIS_2022/basic/such-that/stdout.expected index 07f87e659b..0277c49941 100644 --- a/tests/custom/STARIS_2022/basic/such-that/stdout.expected +++ b/tests/custom/STARIS_2022/basic/such-that/stdout.expected @@ -1,7 +1,7 @@ Generating models for such-that.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: such-that.solution diff --git a/tests/custom/STARIS_2022/basic/tuples/tuple-basic/stdout.expected b/tests/custom/STARIS_2022/basic/tuples/tuple-basic/stdout.expected index 2484823351..f02d866e96 100644 --- a/tests/custom/STARIS_2022/basic/tuples/tuple-basic/stdout.expected +++ b/tests/custom/STARIS_2022/basic/tuples/tuple-basic/stdout.expected @@ -1,7 +1,7 @@ Generating models for tuple.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: tuple.solution diff --git a/tests/custom/STARIS_2022/basic/tuples/tuple-index/stdout.expected b/tests/custom/STARIS_2022/basic/tuples/tuple-index/stdout.expected index 875bff7dbf..787be31376 100644 --- a/tests/custom/STARIS_2022/basic/tuples/tuple-index/stdout.expected +++ b/tests/custom/STARIS_2022/basic/tuples/tuple-index/stdout.expected @@ -1,7 +1,7 @@ Generating models for tuple.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: tuple.solution diff --git a/tests/custom/STARIS_2022/basic/type-conversion-operators/toInt-basic/stdout.expected b/tests/custom/STARIS_2022/basic/type-conversion-operators/toInt-basic/stdout.expected index fa381facca..31dd7bece9 100644 --- a/tests/custom/STARIS_2022/basic/type-conversion-operators/toInt-basic/stdout.expected +++ b/tests/custom/STARIS_2022/basic/type-conversion-operators/toInt-basic/stdout.expected @@ -1,7 +1,7 @@ Generating models for toInt.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: toInt.solution diff --git a/tests/custom/STARIS_2022/basic/type-conversion-operators/toMSet/stdout.expected b/tests/custom/STARIS_2022/basic/type-conversion-operators/toMSet/stdout.expected index fd135dc8a1..05c2af9899 100644 --- a/tests/custom/STARIS_2022/basic/type-conversion-operators/toMSet/stdout.expected +++ b/tests/custom/STARIS_2022/basic/type-conversion-operators/toMSet/stdout.expected @@ -1,7 +1,7 @@ Generating models for toMSet.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: toMSet.solution diff --git a/tests/custom/STARIS_2022/basic/type-conversion-operators/toSet-basic/stdout.expected b/tests/custom/STARIS_2022/basic/type-conversion-operators/toSet-basic/stdout.expected index ce5acfef17..c2f38409ae 100644 --- a/tests/custom/STARIS_2022/basic/type-conversion-operators/toSet-basic/stdout.expected +++ b/tests/custom/STARIS_2022/basic/type-conversion-operators/toSet-basic/stdout.expected @@ -1,7 +1,7 @@ Generating models for toSet.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: toSet.solution diff --git a/tests/custom/STARIS_2022/basic/type-conversion-operators/toSet-sum/stdout.expected b/tests/custom/STARIS_2022/basic/type-conversion-operators/toSet-sum/stdout.expected index 71b33cf81d..067ab25342 100644 --- a/tests/custom/STARIS_2022/basic/type-conversion-operators/toSet-sum/stdout.expected +++ b/tests/custom/STARIS_2022/basic/type-conversion-operators/toSet-sum/stdout.expected @@ -1,7 +1,7 @@ Generating models for toSet-sum.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: toSet-sum.solution diff --git a/tests/custom/STARIS_2022/demo/first_test/stdout.expected b/tests/custom/STARIS_2022/demo/first_test/stdout.expected index 3b2a95105e..ce471d8708 100644 --- a/tests/custom/STARIS_2022/demo/first_test/stdout.expected +++ b/tests/custom/STARIS_2022/demo/first_test/stdout.expected @@ -1,7 +1,7 @@ Generating models for first.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: first.solution diff --git a/tests/custom/STARIS_2022/operation-type-errors/party-type-error-01/stdout.expected b/tests/custom/STARIS_2022/operation-type-errors/party-type-error-01/stdout.expected index 9d9637ab5b..00c12b5408 100644 --- a/tests/custom/STARIS_2022/operation-type-errors/party-type-error-01/stdout.expected +++ b/tests/custom/STARIS_2022/operation-type-errors/party-type-error-01/stdout.expected @@ -1,7 +1,7 @@ Generating models for party-type-error.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: party-type-error.solution diff --git a/tests/custom/absoluteExistingEprimes/run.sh b/tests/custom/absoluteExistingEprimes/run.sh new file mode 100755 index 0000000000..4a1eb8a3cc --- /dev/null +++ b/tests/custom/absoluteExistingEprimes/run.sh @@ -0,0 +1,29 @@ + +rm -rf conjure-output +conjure modelling test.essence --channelling=no -ax + +echo "" +conjure solve test.essence --use-existing-models=model000001.eprime +rm -rf conjure-output/*.solution *.solution + +echo "" +conjure solve test.essence --use-existing-models=model000002.eprime +rm -rf conjure-output/*.solution *.solution + +mkdir -p some/other/dir +cp -r conjure-output/*.eprime some/other/dir/ + +echo "" +conjure solve test.essence --use-existing-models=some/other/dir/model000001.eprime -o conjure-output-1 + +echo "" +conjure solve test.essence --use-existing-models=some/other/dir/model000002.eprime -o conjure-output-2 + +# echo "" +# conjure solve test.essence --use-existing-models=${PWD}/some/other/dir/model000001.eprime -o conjure-output-2-1 + +# echo "" +# conjure solve test.essence --use-existing-models=${PWD}/some/other/dir/model000002.eprime -o conjure-output-2-2 + +rm -rf conjure-output* some *.solution + diff --git a/tests/custom/absoluteExistingEprimes/stdout.expected b/tests/custom/absoluteExistingEprimes/stdout.expected new file mode 100644 index 0000000000..2ab9234825 --- /dev/null +++ b/tests/custom/absoluteExistingEprimes/stdout.expected @@ -0,0 +1,24 @@ + +Using existing models. +Savile Row: conjure-output/model000001.eprime +Running minion for domain filtering. +Running solver: minion +Copying solution to: test.solution + +Using existing models. +Savile Row: conjure-output/model000002.eprime +Running minion for domain filtering. +Running solver: minion +Copying solution to: test.solution + +Using existing models. +Savile Row: some/other/dir/model000001.eprime +Running minion for domain filtering. +Running solver: minion +Copying solution to: test.solution + +Using existing models. +Savile Row: some/other/dir/model000002.eprime +Running minion for domain filtering. +Running solver: minion +Copying solution to: test.solution diff --git a/tests/custom/absoluteExistingEprimes/test.essence b/tests/custom/absoluteExistingEprimes/test.essence new file mode 100644 index 0000000000..8ba7529028 --- /dev/null +++ b/tests/custom/absoluteExistingEprimes/test.essence @@ -0,0 +1 @@ +find x : set (size 2) of int(1..2) diff --git a/tests/custom/allDiff-chuffed/stdout.expected b/tests/custom/allDiff-chuffed/stdout.expected index 2bee654671..34f8469103 100644 --- a/tests/custom/allDiff-chuffed/stdout.expected +++ b/tests/custom/allDiff-chuffed/stdout.expected @@ -1,7 +1,7 @@ Generating models for model.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: chuffed Copying solution to: model.solution diff --git a/tests/custom/allDiffDecomp/1/stdout.expected b/tests/custom/allDiffDecomp/1/stdout.expected index 931b4afd6d..6ceeb2e79c 100644 --- a/tests/custom/allDiffDecomp/1/stdout.expected +++ b/tests/custom/allDiffDecomp/1/stdout.expected @@ -1,7 +1,7 @@ Generating models for allDiffDecomp.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion conjure-output/model000001-solution000001.solution:letting x be [(1, 6), (1, 7), (1, 8); int(1..3)] diff --git a/tests/custom/allDiffDecomp/2/stdout.expected b/tests/custom/allDiffDecomp/2/stdout.expected index 4ec95a6ca7..4b860c0c37 100644 --- a/tests/custom/allDiffDecomp/2/stdout.expected +++ b/tests/custom/allDiffDecomp/2/stdout.expected @@ -1,7 +1,7 @@ Generating models for allDiffDecomp.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion conjure-output/model000001-solution000001.solution:letting y be sequence() diff --git a/tests/custom/astjson-roundtrip/stdout.expected b/tests/custom/astjson-roundtrip/stdout.expected index a9a5b93791..0dd71eb16e 100644 --- a/tests/custom/astjson-roundtrip/stdout.expected +++ b/tests/custom/astjson-roundtrip/stdout.expected @@ -1,7 +1,7 @@ Generating models for sample.json Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: sample.solution diff --git a/tests/custom/basic/comprehension-cardinality/stdout.expected b/tests/custom/basic/comprehension-cardinality/stdout.expected index d4da7b5188..b14240b255 100644 --- a/tests/custom/basic/comprehension-cardinality/stdout.expected +++ b/tests/custom/basic/comprehension-cardinality/stdout.expected @@ -1,7 +1,7 @@ Generating models for comp.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: comp.solution diff --git a/tests/custom/basic/concatenate/stdout.expected b/tests/custom/basic/concatenate/stdout.expected index 12762b53f8..92ca924a2c 100644 --- a/tests/custom/basic/concatenate/stdout.expected +++ b/tests/custom/basic/concatenate/stdout.expected @@ -1,7 +1,7 @@ Generating models for concatenate.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: concatenate.solutions diff --git a/tests/custom/basic/enum_functions/stdout.expected b/tests/custom/basic/enum_functions/stdout.expected index c4b0277910..883b914027 100644 --- a/tests/custom/basic/enum_functions/stdout.expected +++ b/tests/custom/basic/enum_functions/stdout.expected @@ -1,16 +1,16 @@ Generating models for enum_functions.essence Generated 4 models: model000001.eprime, model000002.eprime, model000003.eprime, model000004.eprime Saved under: conjure-output -Savile Row: model000001.eprime p1.param +Savile Row: conjure-output/model000001.eprime p1.param Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime p1.param +Savile Row: conjure-output/model000002.eprime p1.param Running minion for domain filtering. Running solver: minion -Savile Row: model000003.eprime p1.param +Savile Row: conjure-output/model000003.eprime p1.param Running minion for domain filtering. Running solver: minion -Savile Row: model000004.eprime p1.param +Savile Row: conjure-output/model000004.eprime p1.param Running minion for domain filtering. Running solver: minion model000001-p1-solution000001.eprime-solution @@ -35,6 +35,7 @@ model000001-p1.eprime-info model000001-p1.eprime-infor model000001-p1.eprime-minion model000001-p1.eprime-param +model000001-p1.stats.json model000001.eprime model000002-p1-solution000001.eprime-solution model000002-p1-solution000001.solution @@ -58,6 +59,7 @@ model000002-p1.eprime-info model000002-p1.eprime-infor model000002-p1.eprime-minion model000002-p1.eprime-param +model000002-p1.stats.json model000002.eprime model000003-p1-solution000001.eprime-solution model000003-p1-solution000001.solution @@ -81,6 +83,7 @@ model000003-p1.eprime-info model000003-p1.eprime-infor model000003-p1.eprime-minion model000003-p1.eprime-param +model000003-p1.stats.json model000003.eprime model000004-p1-solution000001.eprime-solution model000004-p1-solution000001.solution @@ -104,6 +107,7 @@ model000004-p1.eprime-info model000004-p1.eprime-infor model000004-p1.eprime-minion model000004-p1.eprime-param +model000004-p1.stats.json model000004.eprime conjure-output/model000001-p1-solution000001.solution:letting f be function(a --> b1, b --> b2, c --> b5) conjure-output/model000001-p1-solution000001.solution:letting g be function(b1 --> c, b4 --> b, b5 --> a) diff --git a/tests/custom/basic/enumerate_enum_domain/stdout.expected b/tests/custom/basic/enumerate_enum_domain/stdout.expected index 33730790f0..d6dcec779e 100644 --- a/tests/custom/basic/enumerate_enum_domain/stdout.expected +++ b/tests/custom/basic/enumerate_enum_domain/stdout.expected @@ -1,7 +1,7 @@ Generating models for e.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: e.solution diff --git a/tests/custom/basic/function-literal-suggestion/stdout.expected b/tests/custom/basic/function-literal-suggestion/stdout.expected index 5b00a977ec..fe9d7ebe81 100644 --- a/tests/custom/basic/function-literal-suggestion/stdout.expected +++ b/tests/custom/basic/function-literal-suggestion/stdout.expected @@ -1,4 +1,4 @@ Generating models for func.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime p.param +Savile Row: conjure-output/model000001.eprime p.param diff --git a/tests/custom/basic/function_card_01/stdout.expected b/tests/custom/basic/function_card_01/stdout.expected index 0b551b234b..571ef97beb 100644 --- a/tests/custom/basic/function_card_01/stdout.expected +++ b/tests/custom/basic/function_card_01/stdout.expected @@ -1,10 +1,10 @@ Generating models for function_card_01.essence Generated 2 models: model000001.eprime, model000002.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -43,6 +43,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -79,6 +80,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json conjure-output/model000001-solution000001.solution:letting x be function(2 --> 2, 3 --> 1) conjure-output/model000001-solution000002.solution:letting x be function(2 --> 2, 3 --> 2) conjure-output/model000001-solution000003.solution:letting x be function(2 --> 2, 3 --> 3) diff --git a/tests/custom/basic/function_card_02/stdout.expected b/tests/custom/basic/function_card_02/stdout.expected index af471206c5..d10c083597 100644 --- a/tests/custom/basic/function_card_02/stdout.expected +++ b/tests/custom/basic/function_card_02/stdout.expected @@ -1,10 +1,10 @@ Generating models for function_card_02.essence Generated 2 models: model000001.eprime, model000002.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -25,6 +25,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -43,6 +44,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json conjure-output/model000001-solution000001.solution:letting x be function(2 --> 2, 3 --> 1) conjure-output/model000001-solution000002.solution:letting x be function(2 --> 2, 3 --> 3) conjure-output/model000001-solution000003.solution:letting x be function(1 --> 1) diff --git a/tests/custom/basic/function_imageSet01/stdout.expected b/tests/custom/basic/function_imageSet01/stdout.expected index 246796ee4f..c973c95858 100644 --- a/tests/custom/basic/function_imageSet01/stdout.expected +++ b/tests/custom/basic/function_imageSet01/stdout.expected @@ -2,28 +2,28 @@ Generating models for function_imageSet01.essence Generated 8 models: model000001.eprime, model000002.eprime, model000003.eprime, model000004.eprime, model000005.eprime, model000006.eprime, model000007.eprime, model000008.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000003.eprime +Savile Row: conjure-output/model000003.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000004.eprime +Savile Row: conjure-output/model000004.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000005.eprime +Savile Row: conjure-output/model000005.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000006.eprime +Savile Row: conjure-output/model000006.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000007.eprime +Savile Row: conjure-output/model000007.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000008.eprime +Savile Row: conjure-output/model000008.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -36,6 +36,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -46,6 +47,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json model000003-solution000001.eprime-solution model000003-solution000001.solution model000003-solution000002.eprime-solution @@ -56,6 +58,7 @@ model000003.eprime model000003.eprime-info model000003.eprime-infor model000003.eprime-minion +model000003.stats.json model000004-solution000001.eprime-solution model000004-solution000001.solution model000004-solution000002.eprime-solution @@ -66,6 +69,7 @@ model000004.eprime model000004.eprime-info model000004.eprime-infor model000004.eprime-minion +model000004.stats.json model000005-solution000001.eprime-solution model000005-solution000001.solution model000005-solution000002.eprime-solution @@ -76,6 +80,7 @@ model000005.eprime model000005.eprime-info model000005.eprime-infor model000005.eprime-minion +model000005.stats.json model000006-solution000001.eprime-solution model000006-solution000001.solution model000006-solution000002.eprime-solution @@ -86,6 +91,7 @@ model000006.eprime model000006.eprime-info model000006.eprime-infor model000006.eprime-minion +model000006.stats.json model000007-solution000001.eprime-solution model000007-solution000001.solution model000007-solution000002.eprime-solution @@ -96,6 +102,7 @@ model000007.eprime model000007.eprime-info model000007.eprime-infor model000007.eprime-minion +model000007.stats.json model000008-solution000001.eprime-solution model000008-solution000001.solution model000008-solution000002.eprime-solution @@ -106,6 +113,7 @@ model000008.eprime model000008.eprime-info model000008.eprime-infor model000008.eprime-minion +model000008.stats.json conjure-output/model000001-solution000001.solution:letting f be function() conjure-output/model000001-solution000001.solution:letting s be {} conjure-output/model000001-solution000002.solution:letting f be function(1 --> 1, 2 --> 1) diff --git a/tests/custom/basic/function_inverse_01/stdout.expected b/tests/custom/basic/function_inverse_01/stdout.expected index 0f976aaff0..e92e6793bb 100644 --- a/tests/custom/basic/function_inverse_01/stdout.expected +++ b/tests/custom/basic/function_inverse_01/stdout.expected @@ -1,16 +1,16 @@ Generating models for function_inverse_01.essence Generated 4 models: model000001.eprime, model000002.eprime, model000003.eprime, model000004.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000003.eprime +Savile Row: conjure-output/model000003.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000004.eprime +Savile Row: conjure-output/model000004.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -25,6 +25,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -37,6 +38,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json model000003-solution000001.eprime-solution model000003-solution000001.solution model000003-solution000002.eprime-solution @@ -49,6 +51,7 @@ model000003.eprime model000003.eprime-info model000003.eprime-infor model000003.eprime-minion +model000003.stats.json model000004-solution000001.eprime-solution model000004-solution000001.solution model000004-solution000002.eprime-solution @@ -61,6 +64,7 @@ model000004.eprime model000004.eprime-info model000004.eprime-infor model000004.eprime-minion +model000004.stats.json conjure-output/model000001-solution000001.solution:letting x be function(1 --> 2, 2 --> 3) conjure-output/model000001-solution000001.solution:letting y be function(2 --> 1, 3 --> 2) conjure-output/model000001-solution000002.solution:letting x be function(1 --> 3, 2 --> 1) diff --git a/tests/custom/basic/function_partial_int_01/stdout.expected b/tests/custom/basic/function_partial_int_01/stdout.expected index d4d77230ca..325a646ff3 100644 --- a/tests/custom/basic/function_partial_int_01/stdout.expected +++ b/tests/custom/basic/function_partial_int_01/stdout.expected @@ -1,10 +1,10 @@ Generating models for function_partial_int_01.essence Generated 2 models: model000001.eprime, model000002.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -29,6 +29,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -51,6 +52,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json conjure-output/model000001-solution000001.solution:letting x be function() conjure-output/model000001-solution000002.solution:letting x be function(2 --> 13) conjure-output/model000001-solution000003.solution:letting x be function(2 --> 17) diff --git a/tests/custom/basic/function_partial_int_02/stdout.expected b/tests/custom/basic/function_partial_int_02/stdout.expected index 77a17c947f..766dad2d68 100644 --- a/tests/custom/basic/function_partial_int_02/stdout.expected +++ b/tests/custom/basic/function_partial_int_02/stdout.expected @@ -1,10 +1,10 @@ Generating models for function_partial_int_02.essence Generated 2 models: model000001.eprime, model000002.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -35,6 +35,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -63,6 +64,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json conjure-output/model000001-solution000001.solution:letting x be function(2 --> 13, 3 --> 14) conjure-output/model000001-solution000002.solution:letting x be function(2 --> 14, 3 --> 13) conjure-output/model000001-solution000003.solution:letting x be function(1 --> 13, 3 --> 14) diff --git a/tests/custom/basic/function_partial_int_03/stdout.expected b/tests/custom/basic/function_partial_int_03/stdout.expected index 09e84736af..4d98fa897a 100644 --- a/tests/custom/basic/function_partial_int_03/stdout.expected +++ b/tests/custom/basic/function_partial_int_03/stdout.expected @@ -1,10 +1,10 @@ Generating models for function_partial_int_03.essence Generated 2 models: model000001.eprime, model000002.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -79,6 +79,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -151,6 +152,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json conjure-output/model000001-solution000001.solution:letting x be function() conjure-output/model000001-solution000002.solution:letting x be function(3 --> 13) conjure-output/model000001-solution000003.solution:letting x be function(3 --> 14) diff --git a/tests/custom/basic/function_partial_int_04/stdout.expected b/tests/custom/basic/function_partial_int_04/stdout.expected index 2d2bcc3b56..8d86518c09 100644 --- a/tests/custom/basic/function_partial_int_04/stdout.expected +++ b/tests/custom/basic/function_partial_int_04/stdout.expected @@ -1,10 +1,10 @@ Generating models for function_partial_int_04.essence Generated 2 models: model000001.eprime, model000002.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -157,6 +157,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -307,6 +308,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json conjure-output/model000001-solution000001.solution:letting x be function() conjure-output/model000001-solution000002.solution:letting x be function(3 --> 13) conjure-output/model000001-solution000003.solution:letting x be function(3 --> 14) diff --git a/tests/custom/basic/function_partial_int_05/stdout.expected b/tests/custom/basic/function_partial_int_05/stdout.expected index 8cad5dbec0..b3e4acfccc 100644 --- a/tests/custom/basic/function_partial_int_05/stdout.expected +++ b/tests/custom/basic/function_partial_int_05/stdout.expected @@ -1,10 +1,10 @@ Generating models for function_partial_int_05.essence Generated 2 models: model000001.eprime, model000002.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -23,6 +23,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -39,6 +40,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json conjure-output/model000001-solution000001.solution:letting x be function(1 --> 13, 2 --> 14, 3 --> 15) conjure-output/model000001-solution000002.solution:letting x be function(1 --> 13, 2 --> 15, 3 --> 14) conjure-output/model000001-solution000003.solution:letting x be function(1 --> 14, 2 --> 13, 3 --> 15) diff --git a/tests/custom/basic/function_partial_int_06/stdout.expected b/tests/custom/basic/function_partial_int_06/stdout.expected index ee6f86eaea..86ce0e3d3b 100644 --- a/tests/custom/basic/function_partial_int_06/stdout.expected +++ b/tests/custom/basic/function_partial_int_06/stdout.expected @@ -1,10 +1,10 @@ Generating models for function_partial_int_06.essence Generated 2 models: model000001.eprime, model000002.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion No solutions found. @@ -12,7 +12,9 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json diff --git a/tests/custom/basic/function_partial_int_param/stdout.expected b/tests/custom/basic/function_partial_int_param/stdout.expected index 35e8ae3f0d..49c0eb2da5 100644 --- a/tests/custom/basic/function_partial_int_param/stdout.expected +++ b/tests/custom/basic/function_partial_int_param/stdout.expected @@ -1,10 +1,10 @@ Generating models for function_partial_int_param.essence Generated 2 models: model000001.eprime, model000002.eprime Saved under: conjure-output -Savile Row: model000001.eprime param000181.param +Savile Row: conjure-output/model000001.eprime param000181.param Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime param000181.param +Savile Row: conjure-output/model000002.eprime param000181.param Running minion for domain filtering. Running solver: minion model000001-param000181-solution000001.eprime-solution @@ -13,6 +13,7 @@ model000001-param000181.eprime-info model000001-param000181.eprime-infor model000001-param000181.eprime-minion model000001-param000181.eprime-param +model000001-param000181.stats.json model000001.eprime model000002-param000181-solution000001.eprime-solution model000002-param000181-solution000001.solution @@ -20,6 +21,7 @@ model000002-param000181.eprime-info model000002-param000181.eprime-infor model000002-param000181.eprime-minion model000002-param000181.eprime-param +model000002-param000181.stats.json model000002.eprime conjure-output/model000001-param000181-solution000001.solution:letting x be function(1 --> 15, 2 --> 13) conjure-output/model000002-param000181-solution000001.solution:letting x be function(1 --> 15, 2 --> 13) diff --git a/tests/custom/basic/function_partial_tuple_01/stdout.expected b/tests/custom/basic/function_partial_tuple_01/stdout.expected index 28e8fe4c19..80e72c42a9 100644 --- a/tests/custom/basic/function_partial_tuple_01/stdout.expected +++ b/tests/custom/basic/function_partial_tuple_01/stdout.expected @@ -1,10 +1,10 @@ Generating models for function_partial_tuple_01.essence Generated 2 models: model000001.eprime, model000002.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -29,6 +29,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -51,6 +52,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json conjure-output/model000001-solution000001.solution:letting x be function((7, true) --> 13, (8, false) --> 17) conjure-output/model000001-solution000002.solution:letting x be function((7, true) --> 13, (8, false) --> 17, (8, true) --> 13) conjure-output/model000001-solution000003.solution:letting x be function((7, true) --> 13, (8, false) --> 17, (8, true) --> 17) diff --git a/tests/custom/basic/given-seq-seq/stdout.expected b/tests/custom/basic/given-seq-seq/stdout.expected index 5ffe05e362..c5f10eb457 100644 --- a/tests/custom/basic/given-seq-seq/stdout.expected +++ b/tests/custom/basic/given-seq-seq/stdout.expected @@ -1,7 +1,7 @@ Generating models for seqseq.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime seqseq.param +Savile Row: conjure-output/model000001.eprime seqseq.param Running minion for domain filtering. Running solver: minion Validating solution: seqseq.param conjure-output/model000001-seqseq-solution000001.solution diff --git a/tests/custom/basic/matrix-slicing/stdout.expected b/tests/custom/basic/matrix-slicing/stdout.expected index 47684d60ef..ba3ced8ddb 100644 --- a/tests/custom/basic/matrix-slicing/stdout.expected +++ b/tests/custom/basic/matrix-slicing/stdout.expected @@ -1,7 +1,7 @@ Generating models for slice.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: slice.solution diff --git a/tests/custom/basic/modelling-cache/stdout.expected b/tests/custom/basic/modelling-cache/stdout.expected index d175a7b4df..7c09bfa333 100644 --- a/tests/custom/basic/modelling-cache/stdout.expected +++ b/tests/custom/basic/modelling-cache/stdout.expected @@ -25,7 +25,7 @@ Response: 2 .conjure-checksum model000001.eprime Using cached models. -Savile Row: model000001.eprime 2.param +Savile Row: conjure-output/model000001.eprime 2.param Running minion for domain filtering. Running solver: minion Copying solution to: example-2.solution diff --git a/tests/custom/basic/parsing-enums-in-param/stdout.expected b/tests/custom/basic/parsing-enums-in-param/stdout.expected index da5e63e36c..a649b21c55 100644 --- a/tests/custom/basic/parsing-enums-in-param/stdout.expected +++ b/tests/custom/basic/parsing-enums-in-param/stdout.expected @@ -1,7 +1,7 @@ Generating models for knapsack.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime knapsack.param +Savile Row: conjure-output/model000001.eprime knapsack.param Running minion for domain filtering. Running solver: minion Copying solution to: knapsack-knapsack-000001.solution diff --git a/tests/custom/basic/parsing-imply/stdout.expected b/tests/custom/basic/parsing-imply/stdout.expected index 47e9e92e3a..096be9e40d 100644 --- a/tests/custom/basic/parsing-imply/stdout.expected +++ b/tests/custom/basic/parsing-imply/stdout.expected @@ -14,7 +14,7 @@ Generating models for 2_leftparens.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 2_leftparens.solutions @@ -122,7 +122,7 @@ letting d be true Generating models for 3_rightparens.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 3_rightparens.solutions diff --git a/tests/custom/basic/partition_together_apart/stdout.expected b/tests/custom/basic/partition_together_apart/stdout.expected index 52d2bfa943..b77775c716 100644 --- a/tests/custom/basic/partition_together_apart/stdout.expected +++ b/tests/custom/basic/partition_together_apart/stdout.expected @@ -1,7 +1,7 @@ Generating models for partition_together_apart.essence Generated models: model_1_1.eprime Saved under: conjure-output -Savile Row: model_1_1.eprime +Savile Row: conjure-output/model_1_1.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model_1_1-solution000001.solution diff --git a/tests/custom/basic/restricted01/stdout.expected b/tests/custom/basic/restricted01/stdout.expected index 3d97c1f874..e160b0102c 100644 --- a/tests/custom/basic/restricted01/stdout.expected +++ b/tests/custom/basic/restricted01/stdout.expected @@ -1,7 +1,7 @@ Generating models for restricted01.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -32,6 +32,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json conjure-output/model000001-solution000001.solution:letting x be function((1, 1) --> 1, (1, 2) --> 2, (1, 3) --> 3, (2, 1) --> 2, (2, 2) --> 3, (2, 3) --> 1) conjure-output/model000001-solution000002.solution:letting x be function((1, 1) --> 1, (1, 2) --> 2, (1, 3) --> 3, (2, 1) --> 3, (2, 2) --> 1, (2, 3) --> 2) conjure-output/model000001-solution000003.solution:letting x be function((1, 1) --> 1, (1, 2) --> 3, (1, 3) --> 2, (2, 1) --> 2, (2, 2) --> 1, (2, 3) --> 3) diff --git a/tests/custom/basic/restricted02/stdout.expected b/tests/custom/basic/restricted02/stdout.expected index c50de176e1..4a448781d2 100644 --- a/tests/custom/basic/restricted02/stdout.expected +++ b/tests/custom/basic/restricted02/stdout.expected @@ -1,7 +1,7 @@ Generating models for restricted02.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -32,6 +32,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json conjure-output/model000001-solution000001.solution:letting x be function((1, 1) --> 1, (1, 2) --> 2, (1, 3) --> 3, (2, 1) --> 2, (2, 2) --> 3, (2, 3) --> 1) conjure-output/model000001-solution000002.solution:letting x be function((1, 1) --> 1, (1, 2) --> 2, (1, 3) --> 3, (2, 1) --> 3, (2, 2) --> 1, (2, 3) --> 2) conjure-output/model000001-solution000003.solution:letting x be function((1, 1) --> 1, (1, 2) --> 3, (1, 3) --> 2, (2, 1) --> 2, (2, 2) --> 1, (2, 3) --> 3) diff --git a/tests/custom/basic/restricted03/stdout.expected b/tests/custom/basic/restricted03/stdout.expected index c4785b4ac9..6d2c094536 100644 --- a/tests/custom/basic/restricted03/stdout.expected +++ b/tests/custom/basic/restricted03/stdout.expected @@ -1,10 +1,10 @@ Generating models for restricted03.essence Generated 2 models: model000001.eprime, model000002.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -109,6 +109,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -211,6 +212,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json conjure-output/model000001-solution000001.solution:letting x be function() conjure-output/model000001-solution000002.solution:letting x be function(4 --> 1) conjure-output/model000001-solution000003.solution:letting x be function(4 --> 3) diff --git a/tests/custom/basic/restricted04/stdout.expected b/tests/custom/basic/restricted04/stdout.expected index eec6b32785..3ffdfc81c1 100644 --- a/tests/custom/basic/restricted04/stdout.expected +++ b/tests/custom/basic/restricted04/stdout.expected @@ -1,10 +1,10 @@ Generating models for restricted04.essence Generated 2 models: model000001.eprime, model000002.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -125,6 +125,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -243,6 +244,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json conjure-output/model000001-solution000001.solution:letting x be function() conjure-output/model000001-solution000002.solution:letting x be function((2, 2) --> 1) conjure-output/model000001-solution000003.solution:letting x be function((2, 2) --> 2) diff --git a/tests/custom/basic/sat-branching-on/stdout.expected b/tests/custom/basic/sat-branching-on/stdout.expected index b92f4a7dc1..d779826d5d 100644 --- a/tests/custom/basic/sat-branching-on/stdout.expected +++ b/tests/custom/basic/sat-branching-on/stdout.expected @@ -1,7 +1,7 @@ Generating models for sbo.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion letting a be {1, 2, 3, 4} @@ -20,7 +20,7 @@ letting a be {3, 4} letting a be {3} letting a be {4} Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: kissat letting a be {1, 2, 3, 4} diff --git a/tests/custom/basic/seqset/stdout.expected b/tests/custom/basic/seqset/stdout.expected index fe4e4a8635..1be108a8a9 100644 --- a/tests/custom/basic/seqset/stdout.expected +++ b/tests/custom/basic/seqset/stdout.expected @@ -1,7 +1,7 @@ Generating models for seqset.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: kissat Validating solution: conjure-output/model000001-solution000001.solution diff --git a/tests/custom/basic/sequence-injective/stdout.expected b/tests/custom/basic/sequence-injective/stdout.expected index a3e80d846b..92abc952d1 100644 --- a/tests/custom/basic/sequence-injective/stdout.expected +++ b/tests/custom/basic/sequence-injective/stdout.expected @@ -1,7 +1,7 @@ Generating models for sequence-injective.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion language ESSENCE' 1.0 diff --git a/tests/custom/basic/set-of-tuples-of-enum/stdout.expected b/tests/custom/basic/set-of-tuples-of-enum/stdout.expected index 19db7c6156..06484b0569 100644 --- a/tests/custom/basic/set-of-tuples-of-enum/stdout.expected +++ b/tests/custom/basic/set-of-tuples-of-enum/stdout.expected @@ -1,7 +1,7 @@ Generating models for set-of-tuples.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model000001-solution000001.solution diff --git a/tests/custom/basic/set-of-tuples-of-int/stdout.expected b/tests/custom/basic/set-of-tuples-of-int/stdout.expected index 19db7c6156..06484b0569 100644 --- a/tests/custom/basic/set-of-tuples-of-int/stdout.expected +++ b/tests/custom/basic/set-of-tuples-of-int/stdout.expected @@ -1,7 +1,7 @@ Generating models for set-of-tuples.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model000001-solution000001.solution diff --git a/tests/custom/basic/set-of-tuples-of-unnamed/stdout.expected b/tests/custom/basic/set-of-tuples-of-unnamed/stdout.expected index 102e8a3c9d..9a96368f80 100644 --- a/tests/custom/basic/set-of-tuples-of-unnamed/stdout.expected +++ b/tests/custom/basic/set-of-tuples-of-unnamed/stdout.expected @@ -1,7 +1,7 @@ Generating models for set-of-tuples.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model000001-solution000001.solution diff --git a/tests/custom/basic/set-size-fixed-of-tuples-of-enum/stdout.expected b/tests/custom/basic/set-size-fixed-of-tuples-of-enum/stdout.expected index ce798364f4..8ecae2a9b7 100644 --- a/tests/custom/basic/set-size-fixed-of-tuples-of-enum/stdout.expected +++ b/tests/custom/basic/set-size-fixed-of-tuples-of-enum/stdout.expected @@ -1,7 +1,7 @@ Generating models for set-of-tuples.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model000001-solution000001.solution diff --git a/tests/custom/basic/solutionsInOneFile/stdout.expected b/tests/custom/basic/solutionsInOneFile/stdout.expected index 8dd2ca907b..fe949cd8d0 100644 --- a/tests/custom/basic/solutionsInOneFile/stdout.expected +++ b/tests/custom/basic/solutionsInOneFile/stdout.expected @@ -1,7 +1,7 @@ Generating models for test.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: test.solutions diff --git a/tests/custom/basic/streamline01/stdout.expected b/tests/custom/basic/streamline01/stdout.expected index 925dcb7c8b..fe8e2f0e79 100644 --- a/tests/custom/basic/streamline01/stdout.expected +++ b/tests/custom/basic/streamline01/stdout.expected @@ -1,16 +1,16 @@ Generating models for streamline01.essence Generated 4 models: model000001.eprime, model000002.eprime, model000003.eprime, model000004.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000003.eprime +Savile Row: conjure-output/model000003.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000004.eprime +Savile Row: conjure-output/model000004.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -41,6 +41,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -69,6 +70,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json model000003-solution000001.eprime-solution model000003-solution000001.solution model000003-solution000002.eprime-solution @@ -97,6 +99,7 @@ model000003.eprime model000003.eprime-info model000003.eprime-infor model000003.eprime-minion +model000003.stats.json model000004-solution000001.eprime-solution model000004-solution000001.solution model000004-solution000002.eprime-solution @@ -125,6 +128,7 @@ model000004.eprime model000004.eprime-info model000004.eprime-infor model000004.eprime-minion +model000004.stats.json conjure-output/model000001-solution000001.solution:letting f be function(2 --> 1) conjure-output/model000001-solution000001.solution:letting s be {2} conjure-output/model000001-solution000002.solution:letting f be function(2 --> 2) diff --git a/tests/custom/enum-in-partition/stdout.expected b/tests/custom/enum-in-partition/stdout.expected index ec53a0564c..f9f0cbcb5d 100644 --- a/tests/custom/enum-in-partition/stdout.expected +++ b/tests/custom/enum-in-partition/stdout.expected @@ -1,7 +1,7 @@ Generating models for eip.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: eip.solution diff --git a/tests/custom/graphs/shortest_path/01/stdout.expected b/tests/custom/graphs/shortest_path/01/stdout.expected index 367a0c7435..2b3e141295 100644 --- a/tests/custom/graphs/shortest_path/01/stdout.expected +++ b/tests/custom/graphs/shortest_path/01/stdout.expected @@ -1,7 +1,7 @@ Generating models for graph_connected.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: graph_connected.solution diff --git a/tests/custom/graphs/shortest_path/02/stdout.expected b/tests/custom/graphs/shortest_path/02/stdout.expected index e1b5512833..0139d716e0 100644 --- a/tests/custom/graphs/shortest_path/02/stdout.expected +++ b/tests/custom/graphs/shortest_path/02/stdout.expected @@ -1,7 +1,7 @@ Generating models for graph_connected.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: graph_connected.solution diff --git a/tests/custom/graphs/shortest_path/03/stdout.expected b/tests/custom/graphs/shortest_path/03/stdout.expected index b93f413d85..b78892c783 100644 --- a/tests/custom/graphs/shortest_path/03/stdout.expected +++ b/tests/custom/graphs/shortest_path/03/stdout.expected @@ -1,7 +1,7 @@ Generating models for graph_connected.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: graph_connected.solution diff --git a/tests/custom/graphs/shortest_path/04/stdout.expected b/tests/custom/graphs/shortest_path/04/stdout.expected index eaac7bb838..31a40ae0bf 100644 --- a/tests/custom/graphs/shortest_path/04/stdout.expected +++ b/tests/custom/graphs/shortest_path/04/stdout.expected @@ -1,7 +1,7 @@ Generating models for graph_connected.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: graph_connected.solution diff --git a/tests/custom/issues/119/1/stdout.expected b/tests/custom/issues/119/1/stdout.expected index f7cfabf178..9b2ccb8d93 100644 --- a/tests/custom/issues/119/1/stdout.expected +++ b/tests/custom/issues/119/1/stdout.expected @@ -1,16 +1,16 @@ Generating models for _old_issues_118_smaller.essence Generated 4 models: model_1.eprime, model_2.eprime, model_3.eprime, model_4.eprime Saved under: conjure-output -Savile Row: model_1.eprime +Savile Row: conjure-output/model_1.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_2.eprime +Savile Row: conjure-output/model_2.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_3.eprime +Savile Row: conjure-output/model_3.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_4.eprime +Savile Row: conjure-output/model_4.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model_1-solution000001.solution diff --git a/tests/custom/issues/119/2/stdout.expected b/tests/custom/issues/119/2/stdout.expected index 12ef3569eb..0fd5c801ba 100644 --- a/tests/custom/issues/119/2/stdout.expected +++ b/tests/custom/issues/119/2/stdout.expected @@ -1,13 +1,13 @@ Generating models for _old_issues_118_smaller2.essence Generated 3 models: model_1.eprime, model_2.eprime, model_3.eprime Saved under: conjure-output -Savile Row: model_1.eprime +Savile Row: conjure-output/model_1.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_2.eprime +Savile Row: conjure-output/model_2.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_3.eprime +Savile Row: conjure-output/model_3.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model_1-solution000001.solution diff --git a/tests/custom/issues/284/stdout.expected b/tests/custom/issues/284/stdout.expected index 3650c97d0a..bc2063248a 100644 --- a/tests/custom/issues/284/stdout.expected +++ b/tests/custom/issues/284/stdout.expected @@ -2,28 +2,28 @@ Generating models for _issue_13.essence Generated 8 models: model000001.eprime, model000002.eprime, model000003.eprime, model000004.eprime, model000005.eprime, model000006.eprime, model000007.eprime, model000008.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000003.eprime +Savile Row: conjure-output/model000003.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000004.eprime +Savile Row: conjure-output/model000004.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000005.eprime +Savile Row: conjure-output/model000005.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000006.eprime +Savile Row: conjure-output/model000006.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000007.eprime +Savile Row: conjure-output/model000007.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000008.eprime +Savile Row: conjure-output/model000008.eprime Running minion for domain filtering. Running solver: minion model000001-solution000001.eprime-solution @@ -66,6 +66,7 @@ model000001.eprime model000001.eprime-info model000001.eprime-infor model000001.eprime-minion +model000001.stats.json model000002-solution000001.eprime-solution model000002-solution000001.solution model000002-solution000002.eprime-solution @@ -106,6 +107,7 @@ model000002.eprime model000002.eprime-info model000002.eprime-infor model000002.eprime-minion +model000002.stats.json model000003-solution000001.eprime-solution model000003-solution000001.solution model000003-solution000002.eprime-solution @@ -146,6 +148,7 @@ model000003.eprime model000003.eprime-info model000003.eprime-infor model000003.eprime-minion +model000003.stats.json model000004-solution000001.eprime-solution model000004-solution000001.solution model000004-solution000002.eprime-solution @@ -186,6 +189,7 @@ model000004.eprime model000004.eprime-info model000004.eprime-infor model000004.eprime-minion +model000004.stats.json model000005-solution000001.eprime-solution model000005-solution000001.solution model000005-solution000002.eprime-solution @@ -226,6 +230,7 @@ model000005.eprime model000005.eprime-info model000005.eprime-infor model000005.eprime-minion +model000005.stats.json model000006-solution000001.eprime-solution model000006-solution000001.solution model000006-solution000002.eprime-solution @@ -266,6 +271,7 @@ model000006.eprime model000006.eprime-info model000006.eprime-infor model000006.eprime-minion +model000006.stats.json model000007-solution000001.eprime-solution model000007-solution000001.solution model000007-solution000002.eprime-solution @@ -306,6 +312,7 @@ model000007.eprime model000007.eprime-info model000007.eprime-infor model000007.eprime-minion +model000007.stats.json model000008-solution000001.eprime-solution model000008-solution000001.solution model000008-solution000002.eprime-solution @@ -346,6 +353,7 @@ model000008.eprime model000008.eprime-info model000008.eprime-infor model000008.eprime-minion +model000008.stats.json conjure-output/model000001-solution000001.solution:letting f be function(1 --> 1, 2 --> 1, 3 --> 2) conjure-output/model000001-solution000002.solution:letting f be function(1 --> 1, 2 --> 1, 3 --> 3) conjure-output/model000001-solution000003.solution:letting f be function(1 --> 1, 2 --> 2, 3 --> 1) diff --git a/tests/custom/issues/345/stdout.expected b/tests/custom/issues/345/stdout.expected index c2b1b7e014..51198173a2 100644 --- a/tests/custom/issues/345/stdout.expected +++ b/tests/custom/issues/345/stdout.expected @@ -1,4 +1,4 @@ Generating models for 345.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime p.param +Savile Row: conjure-output/model000001.eprime p.param diff --git a/tests/custom/issues/351/stdout.expected b/tests/custom/issues/351/stdout.expected index bd9fa1408d..72c9a846f0 100644 --- a/tests/custom/issues/351/stdout.expected +++ b/tests/custom/issues/351/stdout.expected @@ -1,14 +1,14 @@ Generating models for 351.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 351.solution Generating models for 351.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 351.solution diff --git a/tests/custom/issues/358/stdout.expected b/tests/custom/issues/358/stdout.expected index a515102c73..7da2a600f1 100644 --- a/tests/custom/issues/358/stdout.expected +++ b/tests/custom/issues/358/stdout.expected @@ -1,7 +1,7 @@ Generating models for 358.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 358.solution diff --git a/tests/custom/issues/370/01/stdout.expected b/tests/custom/issues/370/01/stdout.expected index 433cbb45a9..526da7d2d8 100644 --- a/tests/custom/issues/370/01/stdout.expected +++ b/tests/custom/issues/370/01/stdout.expected @@ -2,28 +2,28 @@ Generating models for 370.essence Generated 8 models: model_1.eprime, model_2.eprime, model_3.eprime, model_4.eprime, model_5.eprime, model_6.eprime, model_7.eprime, model_8.eprime Saved under: conjure-output -Savile Row: model_1.eprime +Savile Row: conjure-output/model_1.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_2.eprime +Savile Row: conjure-output/model_2.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_3.eprime +Savile Row: conjure-output/model_3.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_4.eprime +Savile Row: conjure-output/model_4.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_5.eprime +Savile Row: conjure-output/model_5.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_6.eprime +Savile Row: conjure-output/model_6.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_7.eprime +Savile Row: conjure-output/model_7.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_8.eprime +Savile Row: conjure-output/model_8.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model_1-solution000001.solution diff --git a/tests/custom/issues/370/02/stdout.expected b/tests/custom/issues/370/02/stdout.expected index 581008ab03..c309ae3466 100644 --- a/tests/custom/issues/370/02/stdout.expected +++ b/tests/custom/issues/370/02/stdout.expected @@ -1,16 +1,16 @@ Generating models for 370.essence Generated 4 models: model_1.eprime, model_2.eprime, model_3.eprime, model_4.eprime Saved under: conjure-output -Savile Row: model_1.eprime +Savile Row: conjure-output/model_1.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_2.eprime +Savile Row: conjure-output/model_2.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_3.eprime +Savile Row: conjure-output/model_3.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_4.eprime +Savile Row: conjure-output/model_4.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model_1-solution000001.solution diff --git a/tests/custom/issues/370/03/stdout.expected b/tests/custom/issues/370/03/stdout.expected index 581008ab03..c309ae3466 100644 --- a/tests/custom/issues/370/03/stdout.expected +++ b/tests/custom/issues/370/03/stdout.expected @@ -1,16 +1,16 @@ Generating models for 370.essence Generated 4 models: model_1.eprime, model_2.eprime, model_3.eprime, model_4.eprime Saved under: conjure-output -Savile Row: model_1.eprime +Savile Row: conjure-output/model_1.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_2.eprime +Savile Row: conjure-output/model_2.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_3.eprime +Savile Row: conjure-output/model_3.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_4.eprime +Savile Row: conjure-output/model_4.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model_1-solution000001.solution diff --git a/tests/custom/issues/387/int01/stdout.expected b/tests/custom/issues/387/int01/stdout.expected index 12279140d1..f2bc3d8cd8 100644 --- a/tests/custom/issues/387/int01/stdout.expected +++ b/tests/custom/issues/387/int01/stdout.expected @@ -1,7 +1,7 @@ Generating models for 387.essence Generated models: model.eprime Saved under: conjure-output -Savile Row: model.eprime +Savile Row: conjure-output/model.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model-solution000001.solution diff --git a/tests/custom/issues/387/int02/stdout.expected b/tests/custom/issues/387/int02/stdout.expected index d78c2d2fdf..43e2257ef3 100644 --- a/tests/custom/issues/387/int02/stdout.expected +++ b/tests/custom/issues/387/int02/stdout.expected @@ -1,7 +1,7 @@ Generating models for 387.essence Generated models: model.eprime Saved under: conjure-output -Savile Row: model.eprime +Savile Row: conjure-output/model.eprime Running minion for domain filtering. Running solver: minion No solutions found. diff --git a/tests/custom/issues/387/int03/stdout.expected b/tests/custom/issues/387/int03/stdout.expected index e195b84f97..32242bfeb3 100644 --- a/tests/custom/issues/387/int03/stdout.expected +++ b/tests/custom/issues/387/int03/stdout.expected @@ -1,16 +1,16 @@ Generating models for 387.essence Generated 4 models: model_1.eprime, model_2.eprime, model_3.eprime, model_4.eprime Saved under: conjure-output -Savile Row: model_1.eprime +Savile Row: conjure-output/model_1.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_2.eprime +Savile Row: conjure-output/model_2.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_3.eprime +Savile Row: conjure-output/model_3.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_4.eprime +Savile Row: conjure-output/model_4.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model_1-solution000001.solution diff --git a/tests/custom/issues/387/int04/stdout.expected b/tests/custom/issues/387/int04/stdout.expected index dd1df2e30c..7ffb0e7ce6 100644 --- a/tests/custom/issues/387/int04/stdout.expected +++ b/tests/custom/issues/387/int04/stdout.expected @@ -1,16 +1,16 @@ Generating models for 387.essence Generated 4 models: model_1.eprime, model_2.eprime, model_3.eprime, model_4.eprime Saved under: conjure-output -Savile Row: model_1.eprime +Savile Row: conjure-output/model_1.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_2.eprime +Savile Row: conjure-output/model_2.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_3.eprime +Savile Row: conjure-output/model_3.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_4.eprime +Savile Row: conjure-output/model_4.eprime Running minion for domain filtering. Running solver: minion No solutions found. diff --git a/tests/custom/issues/388/1/stdout.expected b/tests/custom/issues/388/1/stdout.expected index cc90e76998..383f4ca073 100644 --- a/tests/custom/issues/388/1/stdout.expected +++ b/tests/custom/issues/388/1/stdout.expected @@ -1,16 +1,16 @@ Generating models for 388-1.essence Generated 4 models: model_1.eprime, model_2.eprime, model_3.eprime, model_4.eprime Saved under: conjure-output -Savile Row: model_1.eprime +Savile Row: conjure-output/model_1.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_2.eprime +Savile Row: conjure-output/model_2.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_3.eprime +Savile Row: conjure-output/model_3.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_4.eprime +Savile Row: conjure-output/model_4.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model_1-solution000001.solution diff --git a/tests/custom/issues/388/2/stdout.expected b/tests/custom/issues/388/2/stdout.expected index 1af9f5204c..c897101efb 100644 --- a/tests/custom/issues/388/2/stdout.expected +++ b/tests/custom/issues/388/2/stdout.expected @@ -4,52 +4,52 @@ Generated 16 models: model_1_1.eprime, model_1_2.eprime, model_1_3.eprime, model model_3_3.eprime, model_3_4.eprime, model_4_1.eprime, model_4_2.eprime, model_4_3.eprime, model_4_4.eprime Saved under: conjure-output -Savile Row: model_1_1.eprime +Savile Row: conjure-output/model_1_1.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_1_2.eprime +Savile Row: conjure-output/model_1_2.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_1_3.eprime +Savile Row: conjure-output/model_1_3.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_1_4.eprime +Savile Row: conjure-output/model_1_4.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_2_1.eprime +Savile Row: conjure-output/model_2_1.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_2_2.eprime +Savile Row: conjure-output/model_2_2.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_2_3.eprime +Savile Row: conjure-output/model_2_3.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_2_4.eprime +Savile Row: conjure-output/model_2_4.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_3_1.eprime +Savile Row: conjure-output/model_3_1.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_3_2.eprime +Savile Row: conjure-output/model_3_2.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_3_3.eprime +Savile Row: conjure-output/model_3_3.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_3_4.eprime +Savile Row: conjure-output/model_3_4.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_4_1.eprime +Savile Row: conjure-output/model_4_1.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_4_2.eprime +Savile Row: conjure-output/model_4_2.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_4_3.eprime +Savile Row: conjure-output/model_4_3.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model_4_4.eprime +Savile Row: conjure-output/model_4_4.eprime Running minion for domain filtering. Running solver: minion Validating solution: conjure-output/model_1_1-solution000001.solution diff --git a/tests/custom/issues/395/stdout.expected b/tests/custom/issues/395/stdout.expected index 1cffe22cfe..7b4a9e0dbc 100644 --- a/tests/custom/issues/395/stdout.expected +++ b/tests/custom/issues/395/stdout.expected @@ -68,7 +68,7 @@ such that Generating models for 3.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime m_is_3.param +Savile Row: conjure-output/model000001.eprime m_is_3.param Running minion for domain filtering. Running solver: minion Copying solution to: 3-m_is_3.solution diff --git a/tests/custom/issues/400/stdout.expected b/tests/custom/issues/400/stdout.expected index 5ee66f666e..728da0f5d0 100644 --- a/tests/custom/issues/400/stdout.expected +++ b/tests/custom/issues/400/stdout.expected @@ -1,7 +1,7 @@ Generating models for 400.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 400.solution diff --git a/tests/custom/issues/401/stdout.expected b/tests/custom/issues/401/stdout.expected index 09aa62f474..0a8767dd79 100644 --- a/tests/custom/issues/401/stdout.expected +++ b/tests/custom/issues/401/stdout.expected @@ -1,7 +1,7 @@ Generating models for 401-1.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 401-1.solution @@ -18,7 +18,7 @@ letting m be [1, 1, 1, 1, 1; int(1..5)] Generating models for 401-2.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 401-2.solution @@ -44,7 +44,7 @@ $ 1 2 3 Generating models for 401-3.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 401-3.solution diff --git a/tests/custom/issues/404/stdout.expected b/tests/custom/issues/404/stdout.expected index 783b427bc4..857e53c14b 100644 --- a/tests/custom/issues/404/stdout.expected +++ b/tests/custom/issues/404/stdout.expected @@ -1,4 +1,4 @@ Generating models for test.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime test.param +Savile Row: conjure-output/model000001.eprime test.param diff --git a/tests/custom/issues/408/stdout.expected b/tests/custom/issues/408/stdout.expected index 1b974ae7c2..2f6adbe420 100644 --- a/tests/custom/issues/408/stdout.expected +++ b/tests/custom/issues/408/stdout.expected @@ -31,7 +31,7 @@ Response: 1 Response: 1 Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 408.solution @@ -76,7 +76,7 @@ Response: 2 Response: 2 Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 408.solution @@ -121,7 +121,7 @@ Response: 3 Response: 3 Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 408.solution @@ -166,7 +166,7 @@ Response: 4 Response: 4 Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 408.solution diff --git a/tests/custom/issues/430/stdout.expected b/tests/custom/issues/430/stdout.expected index f9f7266cf8..31620f54f7 100644 --- a/tests/custom/issues/430/stdout.expected +++ b/tests/custom/issues/430/stdout.expected @@ -1,7 +1,7 @@ Generating models for 430.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime p.param +Savile Row: conjure-output/model000001.eprime p.param Running minion for domain filtering. Running solver: minion Copying solution to: 430-p-000001.solution diff --git a/tests/custom/issues/432/stdout.expected b/tests/custom/issues/432/stdout.expected index fb987144ee..6b573dfa78 100644 --- a/tests/custom/issues/432/stdout.expected +++ b/tests/custom/issues/432/stdout.expected @@ -1,4 +1,4 @@ Generating models for 4col.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime p.param +Savile Row: conjure-output/model000001.eprime p.param diff --git a/tests/custom/issues/438/stdout.expected b/tests/custom/issues/438/stdout.expected index 7f4ef0d4b0..b281b2f5ad 100644 --- a/tests/custom/issues/438/stdout.expected +++ b/tests/custom/issues/438/stdout.expected @@ -1,7 +1,7 @@ Generating models for 1.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime 1.param +Savile Row: conjure-output/model000001.eprime 1.param Running minion for domain filtering. Running solver: minion Copying solution to: 1-1.solution diff --git a/tests/custom/issues/440/stdout.expected b/tests/custom/issues/440/stdout.expected index cdfe5b4339..4b17df8090 100644 --- a/tests/custom/issues/440/stdout.expected +++ b/tests/custom/issues/440/stdout.expected @@ -1,4 +1,4 @@ Generating models for 440.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime p.param +Savile Row: conjure-output/model000001.eprime p.param diff --git a/tests/custom/issues/443/stdout.expected b/tests/custom/issues/443/stdout.expected index ce6c3fe756..1a940a4f11 100644 --- a/tests/custom/issues/443/stdout.expected +++ b/tests/custom/issues/443/stdout.expected @@ -1,7 +1,7 @@ Generating models for 443-workaround.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion No solutions found. @@ -14,7 +14,7 @@ such that a = ([] : `matrix indexed by [int()] of int`)[1] Generating models for 443.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion No solutions found. @@ -27,7 +27,7 @@ such that a = [][1] Generating models for 443-bool.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 443-bool.solution @@ -43,7 +43,7 @@ letting a be false Generating models for 443-bool-typed.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 443-bool-typed.solution diff --git a/tests/custom/issues/446/stdout.expected b/tests/custom/issues/446/stdout.expected index cba9a6f5fe..0419b19720 100644 --- a/tests/custom/issues/446/stdout.expected +++ b/tests/custom/issues/446/stdout.expected @@ -1,7 +1,7 @@ Generating models for model.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime inst.param +Savile Row: conjure-output/model000001.eprime inst.param Error: The value is not a member of the domain. Value : sequence(1, 2, 3, 4, 5) @@ -11,7 +11,7 @@ Error: Generating models for model.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime inst2.param +Savile Row: conjure-output/model000001.eprime inst2.param Error: The value is not a member of the domain. Value : sequence(1, 2, 3, 4) diff --git a/tests/custom/issues/448/stdout.expected b/tests/custom/issues/448/stdout.expected index 61da7cc3be..8da0ddb570 100644 --- a/tests/custom/issues/448/stdout.expected +++ b/tests/custom/issues/448/stdout.expected @@ -1,7 +1,7 @@ Generating models for 448-1.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 448-1.solution @@ -42,7 +42,7 @@ letting s be Generating models for 448-2.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 448-2.solution @@ -69,7 +69,7 @@ letting s be Generating models for 448-3.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 448-3.solution diff --git a/tests/custom/issues/453/stdout.expected b/tests/custom/issues/453/stdout.expected index d543dd614d..20667fc466 100644 --- a/tests/custom/issues/453/stdout.expected +++ b/tests/custom/issues/453/stdout.expected @@ -1,7 +1,7 @@ Generating models for test.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime test.param +Savile Row: conjure-output/model000001.eprime test.param Running minion for domain filtering. Running solver: minion Copying solution to: test-test.solution diff --git a/tests/custom/issues/473/stdout.expected b/tests/custom/issues/473/stdout.expected index 4ded4ca75e..7bf2c45ee4 100644 --- a/tests/custom/issues/473/stdout.expected +++ b/tests/custom/issues/473/stdout.expected @@ -1,7 +1,7 @@ Generating models for works.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime test.param +Savile Row: conjure-output/model000001.eprime test.param Running minion for domain filtering. Running solver: minion Copying solution to: works-test.solution @@ -13,7 +13,7 @@ letting x be {a1, a2, a3} Generating models for regression.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime test.param +Savile Row: conjure-output/model000001.eprime test.param Running minion for domain filtering. Running solver: minion Copying solution to: regression-test.solution diff --git a/tests/custom/issues/479/stdout.expected b/tests/custom/issues/479/stdout.expected index ddec3538af..23f81d8b50 100644 --- a/tests/custom/issues/479/stdout.expected +++ b/tests/custom/issues/479/stdout.expected @@ -1,7 +1,7 @@ Generating models for model-instanceGenerator.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime p.param +Savile Row: conjure-output/model000001.eprime p.param Running minion for domain filtering. Running solver: minion Copying solution to: model-instanceGenerator-p.solution diff --git a/tests/custom/issues/480/stdout.expected b/tests/custom/issues/480/stdout.expected index 9838469788..7f3a2a5a0b 100644 --- a/tests/custom/issues/480/stdout.expected +++ b/tests/custom/issues/480/stdout.expected @@ -1,7 +1,7 @@ Generating models for model-instanceGenerator.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime p.param +Savile Row: conjure-output/model000001.eprime p.param Running minion for domain filtering. Running solver: minion Copying solution to: model-instanceGenerator-p.solution diff --git a/tests/custom/issues/486/stdout.expected b/tests/custom/issues/486/stdout.expected index 6daf8ba73d..968d57360c 100644 --- a/tests/custom/issues/486/stdout.expected +++ b/tests/custom/issues/486/stdout.expected @@ -1,7 +1,7 @@ Generating models for model.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion language Essence 1.3 diff --git a/tests/custom/issues/501/stdout.expected b/tests/custom/issues/501/stdout.expected index d785e437fe..798631cc4b 100644 --- a/tests/custom/issues/501/stdout.expected +++ b/tests/custom/issues/501/stdout.expected @@ -1,7 +1,7 @@ Generating models for 501.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime 501.param +Savile Row: conjure-output/model000001.eprime 501.param Running minion for domain filtering. Running solver: minion Copying solution to: 501-501.solution diff --git a/tests/custom/issues/503/stdout.expected b/tests/custom/issues/503/stdout.expected index a42ddf71fa..42bb463d8b 100644 --- a/tests/custom/issues/503/stdout.expected +++ b/tests/custom/issues/503/stdout.expected @@ -1,13 +1,13 @@ Generating models for 503.essence Generated 3 models: model000001.eprime, model000002.eprime, model000003.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000002.eprime +Savile Row: conjure-output/model000002.eprime Running minion for domain filtering. Running solver: minion -Savile Row: model000003.eprime +Savile Row: conjure-output/model000003.eprime Running minion for domain filtering. Running solver: minion conjure-output/model000001.eprime:find S_ExplicitR8_ExplicitWithFlags_Flags: matrix indexed by [int(1..10), int(1..20)] of int(0..20) diff --git a/tests/custom/issues/506/stdout.expected b/tests/custom/issues/506/stdout.expected index 9ac9fe1477..144653332f 100644 --- a/tests/custom/issues/506/stdout.expected +++ b/tests/custom/issues/506/stdout.expected @@ -1,7 +1,7 @@ Generating models for model.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime test.param +Savile Row: conjure-output/model000001.eprime test.param Running minion for domain filtering. Running solver: minion Copying solution to: model-test.solution diff --git a/tests/custom/issues/511/stdout.expected b/tests/custom/issues/511/stdout.expected index 9819f4912a..ee42a95709 100644 --- a/tests/custom/issues/511/stdout.expected +++ b/tests/custom/issues/511/stdout.expected @@ -1,7 +1,7 @@ Generating models for 511.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: 511-000001.solution diff --git a/tests/custom/issues/548/1/stdout.expected b/tests/custom/issues/548/1/stdout.expected index 5f8d78d53f..73bdd116e4 100644 --- a/tests/custom/issues/548/1/stdout.expected +++ b/tests/custom/issues/548/1/stdout.expected @@ -1,7 +1,7 @@ Generating models for 548.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime p.json +Savile Row: conjure-output/model000001.eprime p.json Running minion for domain filtering. Running solver: minion Copying solution to: 548-p.solution diff --git a/tests/custom/issues/548/2/stdout.expected b/tests/custom/issues/548/2/stdout.expected index 947d3c74f5..4a6d5eff6d 100644 --- a/tests/custom/issues/548/2/stdout.expected +++ b/tests/custom/issues/548/2/stdout.expected @@ -1,7 +1,7 @@ Generating models for variant.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime param.json +Savile Row: conjure-output/model000001.eprime param.json Running minion for domain filtering. Running solver: minion Copying solution to: variant-param.solution diff --git a/tests/custom/issues/549/1/stdout.expected b/tests/custom/issues/549/1/stdout.expected index aef9e84cb4..fdfb819480 100644 --- a/tests/custom/issues/549/1/stdout.expected +++ b/tests/custom/issues/549/1/stdout.expected @@ -1,7 +1,7 @@ Generating models for 549_1.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime p.json +Savile Row: conjure-output/model000001.eprime p.json Running minion for domain filtering. Running solver: minion Copying solution to: 549_1-p.solution diff --git a/tests/custom/issues/549/2/stdout.expected b/tests/custom/issues/549/2/stdout.expected index 1e9e8310fe..e7b0e67e79 100644 --- a/tests/custom/issues/549/2/stdout.expected +++ b/tests/custom/issues/549/2/stdout.expected @@ -1,7 +1,7 @@ Generating models for 549_2.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime param.json +Savile Row: conjure-output/model000001.eprime param.json Running minion for domain filtering. Running solver: minion Copying solution to: 549_2-param.solution diff --git a/tests/custom/issues/578/stdout.expected b/tests/custom/issues/578/stdout.expected index f4956ae929..08abf0f13e 100644 --- a/tests/custom/issues/578/stdout.expected +++ b/tests/custom/issues/578/stdout.expected @@ -1,14 +1,14 @@ Generating models for e.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime q.param +Savile Row: conjure-output/model000001.eprime q.param Running minion for domain filtering. Running solver: minion Copying solution to: e-q.solution Generating models for e.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime d/p.param +Savile Row: conjure-output/model000001.eprime d/p.param Running minion for domain filtering. Running solver: minion Copying solution to: e-p.solution diff --git a/tests/custom/issues/659/659.essence b/tests/custom/issues/659/659.essence new file mode 100644 index 0000000000..1f7ee8b0cd --- /dev/null +++ b/tests/custom/issues/659/659.essence @@ -0,0 +1,3 @@ +find x : int(1..10) +such that +(x ** 2) % 2 = 0 diff --git a/tests/custom/issues/659/run.sh b/tests/custom/issues/659/run.sh new file mode 100755 index 0000000000..0f8912cc9f --- /dev/null +++ b/tests/custom/issues/659/run.sh @@ -0,0 +1 @@ +conjure streamlining 659.essence \ No newline at end of file diff --git a/tests/custom/issues/659/stderr.expected b/tests/custom/issues/659/stderr.expected new file mode 100644 index 0000000000..b174a50c9f --- /dev/null +++ b/tests/custom/issues/659/stderr.expected @@ -0,0 +1 @@ +Number of streamliners: 4 diff --git a/tests/custom/issues/659/stdout.expected b/tests/custom/issues/659/stdout.expected new file mode 100644 index 0000000000..bdc7be746d --- /dev/null +++ b/tests/custom/issues/659/stdout.expected @@ -0,0 +1,12 @@ +{"1": {"onVariable": "x", + "groups": ["IntOddEven"], + "constraint": "x % 2 = 1"}, + "2": {"onVariable": "x", + "groups": ["IntOddEven"], + "constraint": "x % 2 = 0"}, + "3": {"onVariable": "x", + "groups": ["IntLowHigh"], + "constraint": "x <= 1 + (10 - 1) / 2"}, + "4": {"onVariable": "x", + "groups": ["IntLowHigh"], + "constraint": "x > 1 + (10 - 1) / 2"}} diff --git a/tests/custom/json-integration/json-in/stdout.expected b/tests/custom/json-integration/json-in/stdout.expected index e5229b00c8..f6e532be43 100644 --- a/tests/custom/json-integration/json-in/stdout.expected +++ b/tests/custom/json-integration/json-in/stdout.expected @@ -1,7 +1,7 @@ Generating models for test.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime param.json +Savile Row: conjure-output/model000001.eprime param.json Running solver: minion {"fCard": 2, "ff": {"1": 2, "2": 3}, "mCard": 6, "qCard": 6, "rCard": 2, diff --git a/tests/custom/json-integration/json-out/stdout.expected b/tests/custom/json-integration/json-out/stdout.expected index 4ddd63da36..0004519a0e 100644 --- a/tests/custom/json-integration/json-out/stdout.expected +++ b/tests/custom/json-integration/json-out/stdout.expected @@ -1,7 +1,7 @@ Generating models for test.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion {"b": false, diff --git a/tests/custom/json-integration/json-solution/stdout.expected b/tests/custom/json-integration/json-solution/stdout.expected index 1d052aeeca..f5f98cc112 100644 --- a/tests/custom/json-integration/json-solution/stdout.expected +++ b/tests/custom/json-integration/json-solution/stdout.expected @@ -1,7 +1,7 @@ Generating models for json-solution.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime n4.param +Savile Row: conjure-output/model000001.eprime n4.param Running minion for domain filtering. Running solver: minion Copying solution to: json-solution-n4.solution diff --git a/tests/custom/json-integration/jsons-out/stdout.expected b/tests/custom/json-integration/jsons-out/stdout.expected index 1baae5ce1d..65b12764b0 100644 --- a/tests/custom/json-integration/jsons-out/stdout.expected +++ b/tests/custom/json-integration/jsons-out/stdout.expected @@ -1,7 +1,7 @@ Generating models for jsons.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion [ diff --git a/tests/custom/json-integration/jsons-streaming-out/stdout.expected b/tests/custom/json-integration/jsons-streaming-out/stdout.expected index 65fb9eeec7..2f3ce8e320 100644 --- a/tests/custom/json-integration/jsons-streaming-out/stdout.expected +++ b/tests/custom/json-integration/jsons-streaming-out/stdout.expected @@ -1,7 +1,7 @@ Generating models for jsons.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion {"x": [3, 4]} diff --git a/tests/custom/json-integration/nosols/stdout.expected b/tests/custom/json-integration/nosols/stdout.expected index 6055d089a4..07d60fce03 100644 --- a/tests/custom/json-integration/nosols/stdout.expected +++ b/tests/custom/json-integration/nosols/stdout.expected @@ -1,7 +1,7 @@ Generating models for nosols.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion No solutions found. diff --git a/tests/custom/matrixNoIndexedBy/stdout.expected b/tests/custom/matrixNoIndexedBy/stdout.expected index 2307606216..1284201b3f 100644 --- a/tests/custom/matrixNoIndexedBy/stdout.expected +++ b/tests/custom/matrixNoIndexedBy/stdout.expected @@ -1,7 +1,7 @@ Generating models for matrixQ.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: matrixQ.solution diff --git a/tests/custom/mildly_interesting/footballtennis_riddle/stdout.expected b/tests/custom/mildly_interesting/footballtennis_riddle/stdout.expected index bb154d763d..aee81520eb 100644 --- a/tests/custom/mildly_interesting/footballtennis_riddle/stdout.expected +++ b/tests/custom/mildly_interesting/footballtennis_riddle/stdout.expected @@ -1,24 +1,24 @@ Generating models for riddle1.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: riddle1.solution Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: kissat Copying solution to: riddle1.solution Generating models for riddle2.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: riddle2.solution Using cached models. -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: kissat Copying solution to: riddle2.solution diff --git a/tests/custom/preImageSeq/LangfordDirect.essence b/tests/custom/preImageSeq/LangfordDirect.essence new file mode 100644 index 0000000000..408b99e010 --- /dev/null +++ b/tests/custom/preImageSeq/LangfordDirect.essence @@ -0,0 +1,34 @@ +language Essence 1.3 +$ prob024.essence: Langford's Number Problem +$ Problem details available at http://www.csplib.org/Problems/prob024 + +$ numbers 1 to n, each appearing k times in a sequence (of length k*n) +given k : int(2..) +given n : int(1..) + +letting seqLength be k * n + +$ The sequence of numbers +find seq : sequence (size seqLength) of int(1..n) + +$ symmetry breaking +such that seq(1) < seq(seqLength) + +$ Each number from 1 to n appear exactly k times in seq. +$ This constraint is implied, and it probably doesn't help search either. +such that + forAll i : int(1..n) . |preImage(seq, i)| = k + +$ Each occurrence of a number N is N positions apart. +$ +$ So if the number 4 is at position 1 and if k=3, +$ then there has to be a 4 at position 6 and 11 as well. +such that + $ for each number + forAll number : int(1..n) . + $ there exists a starting position + $ (i.e. the first position where number occurs) + exists start : int(1..seqLength) . + $ positions start, start+(number+1), start+2*(number+1), ... + $ all contain the value "number" + forAll i : int(1..k) . seq(start + (i-1) * (number+1)) = number diff --git a/tests/custom/preImageSeq/run.sh b/tests/custom/preImageSeq/run.sh new file mode 100755 index 0000000000..ecfe28be91 --- /dev/null +++ b/tests/custom/preImageSeq/run.sh @@ -0,0 +1,4 @@ +rm -rf conjure-output +conjure modelling *.essence +head -n20 conjure-output/model000001.eprime +rm -rf conjure-output diff --git a/tests/custom/preImageSeq/stdout.expected b/tests/custom/preImageSeq/stdout.expected new file mode 100644 index 0000000000..e370f9eef3 --- /dev/null +++ b/tests/custom/preImageSeq/stdout.expected @@ -0,0 +1,20 @@ +language ESSENCE' 1.0 + +given k: int(2..) +given n: int(1..) +letting seqLength be k * n +find seq_ExplicitBounded_Length: int(seqLength) +find seq_ExplicitBounded_Values: matrix indexed by [int(1..seqLength)] of int(1..n) +branching on [seq_ExplicitBounded_Length, seq_ExplicitBounded_Values] +such that + seq_ExplicitBounded_Values[1] < seq_ExplicitBounded_Values[seqLength], + 1 <= seqLength, + and([sum([toInt(seq_ExplicitBounded_Values[q4] = i) | q4 : int(1..seqLength), q4 <= seqLength]) = k + | i : int(1..n)]), + and([or([and([seq_ExplicitBounded_Values[start + (i - 1) * (number + 1)] = number /\ + start + (i - 1) * (number + 1) <= seqLength + | i : int(1..k)]) + | start : int(1..seqLength)]) + | number : int(1..n)]) + +$ Conjure's diff --git a/tests/custom/solution-copy-dashed/stdout.expected b/tests/custom/solution-copy-dashed/stdout.expected index 0fd97cecdc..5fa63c499d 100644 --- a/tests/custom/solution-copy-dashed/stdout.expected +++ b/tests/custom/solution-copy-dashed/stdout.expected @@ -1,13 +1,13 @@ Generating models for sumplete-2023053102.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime p.param +Savile Row: conjure-output/model000001.eprime p.param Running minion for domain filtering. Running solver: minion Copying solution to: sumplete-2023053102-p.solution sumplete-2023053102-p.solution Using cached models. -Savile Row: model000001.eprime sumplete-1x1-42.param +Savile Row: conjure-output/model000001.eprime sumplete-1x1-42.param Running minion for domain filtering. Running solver: minion Copying solution to: sumplete-2023053102-sumplete-1x1-42.solution diff --git a/tests/custom/streamlining/covering-array/CoveringArray.essence b/tests/custom/streamlining/covering-array/CoveringArray.essence new file mode 100644 index 0000000000..d857f3ff8d --- /dev/null +++ b/tests/custom/streamlining/covering-array/CoveringArray.essence @@ -0,0 +1,74 @@ +language Essence 1.3 + +$ This is the decision version of the cover test problem + +given t : int(1..) $ strength (size of subset of rows) +given k : int(1..) $ rows +given g : int(2..) $ number of values +given b : int(1..) $ columns + +where k>=t, b>=g**t + +$ TODO: +$ - Look into the second model from https://link.springer.com/content/pdf/10.1007/s10601-006-7094-9.pdf +$ - Can we break the symmetry via unnamed types? + +$ k * b of 1..g +find CA: matrix indexed by [int(1..k), int(1..b)] of int(1..g) + +such that + forAll rows : sequence (size t) of int(1..k) . + (forAll i : int(2..t) . rows(i-1) < rows(i)) -> + forAll values : sequence (size t) of int(1..g) . + exists column : int(1..b) . + forAll i : int(1..t) . + CA[rows(i), column] = values(i) + +$ $ row & col symmetry breaking +$ such that forAll i : int(2..k) . CA[i-1,..] <=lex CA[i,..] +$ such that forAll i : int(2..b) . CA[..,i-1] <=lex CA[..,i] + +$ $ ============================================================================= +$ $ EXAMPLE +$ $ g=2 values +$ $ k=5 rows +$ $ b=10 columns +$ $ any subset of t=3 rows selected will contain all full-factorial assignments +$ $ 0 0 0 0 0 1 1 1 1 1 +$ $ 0 0 0 1 1 0 0 1 1 1 +$ $ 0 0 1 0 1 0 1 0 1 1 +$ $ 0 1 0 0 1 0 1 1 0 1 +$ $ 0 1 1 1 0 1 0 0 0 1 + +$ $ ============================================================================= +$ $ INSTANCES +$ $ +$ $ Note: These are all easy in that they can be solved by MiniZinc in under 2 minutes. +$ $ The paper cited below uses Ilog Solver, which is tens of times faster. +$ $ +$ $ These are easy and unsat +$ $ letting t be 3, g be 2, k be 5, b be 8 +$ $ letting t be 3, g be 2, k be 5, b be 9 +$ $ letting t be 3, g be 2, k be 6, b be 8 +$ $ letting t be 3, g be 2, k be 6, b be 9 +$ $ letting t be 3, g be 2, k be 6, b be 10 +$ $ letting t be 3, g be 2, k be 7, b be 8 +$ $ letting t be 3, g be 2, k be 7, b be 9 +$ $ letting t be 3, g be 2, k be 8, b be 8 +$ $ letting t be 3, g be 2, k be 8, b be 11 +$ $ letting t be 3, g be 2, k be 9, b be 11 +$ $ letting t be 3, g be 2, k be 10, b be 11 +$ $ letting t be 3, g be 2, k be 11, b be 11 +$ $ letting t be 3, g be 2, k be 12, b be 11 +$ $ +$ $ These are easy and sat +$ $ letting t be 3, g be 2, k be 4, b be 8 +$ $ letting t be 3, g be 2, k be 4, b be 9 +$ $ letting t be 3, g be 2, k be 5, b be 10 +$ $ letting t be 3, g be 2, k be 6, b be 12 +$ $ letting t be 3, g be 2, k be 7, b be 12 +$ $ letting t be 3, g be 2, k be 8, b be 12 +$ $ letting t be 3, g be 2, k be 9, b be 12 +$ $ letting t be 3, g be 2, k be 10, b be 12 +$ $ letting t be 3, g be 2, k be 11, b be 12 + diff --git a/tests/custom/streamlining/covering-array/run.sh b/tests/custom/streamlining/covering-array/run.sh new file mode 100755 index 0000000000..ddc49374c8 --- /dev/null +++ b/tests/custom/streamlining/covering-array/run.sh @@ -0,0 +1,2 @@ + +conjure streamlining *.essence diff --git a/tests/custom/streamlining/covering-array/stderr.expected b/tests/custom/streamlining/covering-array/stderr.expected new file mode 100644 index 0000000000..a596c317be --- /dev/null +++ b/tests/custom/streamlining/covering-array/stderr.expected @@ -0,0 +1 @@ +Number of streamliners: 424 diff --git a/tests/custom/streamlining/covering-array/stdout.expected b/tests/custom/streamlining/covering-array/stdout.expected new file mode 100644 index 0000000000..1c258fba87 --- /dev/null +++ b/tests/custom/streamlining/covering-array/stdout.expected @@ -0,0 +1,1512 @@ +{"1": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 1 | q2 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "2": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 0 | q2 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "3": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] <= 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "4": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] > 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "5": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 1) | q3 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "6": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 0) | q3 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "7": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] <= 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "8": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] > 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "9": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 1) | q4 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "10": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 0) | q4 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "11": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] <= 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "12": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] > 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "13": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "14": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "15": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "16": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "17": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 1) | q6 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "18": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 0) | q6 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "19": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] <= 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "20": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] > 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "21": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 1) | q7 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "22": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 0) | q7 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "23": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] <= 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "24": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-0", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] > 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 0 * ((k - 1 + 1) / 10)..min([k, 1 + (0 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "25": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 1 | q2 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "26": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 0 | q2 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "27": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] <= 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "28": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] > 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "29": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 1) | q3 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "30": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 0) | q3 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "31": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] <= 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "32": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] > 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "33": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 1) | q4 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "34": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 0) | q4 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "35": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] <= 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "36": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] > 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "37": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "38": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "39": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "40": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "41": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 1) | q6 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "42": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 0) | q6 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "43": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] <= 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "44": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] > 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "45": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 1) | q7 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "46": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 0) | q7 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "47": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] <= 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "48": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-1", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] > 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 1 * ((k - 1 + 1) / 10)..min([k, 1 + (1 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "49": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 1 | q2 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "50": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 0 | q2 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "51": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] <= 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "52": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] > 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "53": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 1) | q3 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "54": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 0) | q3 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "55": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] <= 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "56": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] > 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "57": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 1) | q4 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "58": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 0) | q4 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "59": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] <= 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "60": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] > 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "61": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "62": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "63": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "64": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "65": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 1) | q6 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "66": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 0) | q6 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "67": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] <= 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "68": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] > 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "69": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 1) | q7 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "70": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 0) | q7 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "71": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] <= 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "72": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-2", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] > 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 2 * ((k - 1 + 1) / 10)..min([k, 1 + (2 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "73": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 1 | q2 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "74": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 0 | q2 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "75": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] <= 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "76": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] > 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "77": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 1) | q3 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "78": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 0) | q3 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "79": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] <= 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "80": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] > 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "81": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 1) | q4 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "82": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 0) | q4 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "83": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] <= 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "84": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] > 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "85": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "86": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "87": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "88": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "89": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 1) | q6 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "90": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 0) | q6 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "91": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] <= 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "92": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] > 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "93": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 1) | q7 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "94": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 0) | q7 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "95": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] <= 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "96": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-3", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] > 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 3 * ((k - 1 + 1) / 10)..min([k, 1 + (3 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "97": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 1 | q2 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "98": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 0 | q2 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "99": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] <= 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "100": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] > 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "101": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 1) | q3 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "102": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 0) | q3 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "103": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] <= 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "104": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] > 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "105": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 1) | q4 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "106": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 0) | q4 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "107": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] <= 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "108": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] > 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "109": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "110": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "111": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "112": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "113": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 1) | q6 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "114": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 0) | q6 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "115": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] <= 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "116": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] > 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "117": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 1) | q7 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "118": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 0) | q7 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "119": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] <= 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "120": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-4", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] > 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 4 * ((k - 1 + 1) / 10)..min([k, 1 + (4 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "121": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 1 | q2 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "122": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 0 | q2 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "123": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] <= 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "124": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] > 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "125": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 1) | q3 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "126": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 0) | q3 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "127": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] <= 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "128": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] > 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "129": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 1) | q4 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "130": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 0) | q4 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "131": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] <= 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "132": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] > 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "133": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "134": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "135": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "136": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "137": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 1) | q6 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "138": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 0) | q6 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "139": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] <= 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "140": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] > 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "141": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 1) | q7 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "142": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 0) | q7 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "143": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] <= 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "144": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-5", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] > 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 5 * ((k - 1 + 1) / 10)..min([k, 1 + (5 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "145": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 1 | q2 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "146": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 0 | q2 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "147": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] <= 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "148": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] > 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "149": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 1) | q3 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "150": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 0) | q3 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "151": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] <= 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "152": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] > 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "153": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 1) | q4 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "154": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 0) | q4 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "155": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] <= 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "156": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] > 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "157": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "158": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "159": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "160": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "161": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 1) | q6 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "162": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 0) | q6 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "163": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] <= 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "164": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] > 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "165": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 1) | q7 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "166": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 0) | q7 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "167": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] <= 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "168": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-6", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] > 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 6 * ((k - 1 + 1) / 10)..min([k, 1 + (6 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "169": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 1 | q2 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "170": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 0 | q2 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "171": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] <= 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "172": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] > 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "173": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 1) | q3 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "174": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 0) | q3 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "175": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] <= 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "176": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] > 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "177": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 1) | q4 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "178": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 0) | q4 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "179": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] <= 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "180": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] > 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "181": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "182": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "183": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "184": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "185": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 1) | q6 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "186": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 0) | q6 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "187": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] <= 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "188": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] > 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "189": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 1) | q7 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "190": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 0) | q7 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "191": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] <= 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "192": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-7", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] > 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 7 * ((k - 1 + 1) / 10)..min([k, 1 + (7 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "193": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 1 | q2 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "194": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 0 | q2 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "195": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] <= 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "196": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] > 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "197": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 1) | q3 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "198": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 0) | q3 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "199": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] <= 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "200": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] > 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "201": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 1) | q4 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "202": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 0) | q4 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "203": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] <= 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "204": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] > 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "205": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "206": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "207": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "208": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "209": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 1) | q6 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "210": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 0) | q6 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "211": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] <= 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "212": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] > 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "213": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 1) | q7 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "214": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 0) | q7 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "215": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] <= 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "216": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-8", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] > 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 8 * ((k - 1 + 1) / 10)..min([k, 1 + (8 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "217": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 1 | q2 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "218": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([and([CA[q1, q2] % 2 = 0 | q2 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "219": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] <= 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "220": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([and([CA[q1, q2] > 1 + (g - 1) / 2 | q2 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "221": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 1) | q3 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "222": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] % 2 = 0) | q3 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "223": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] <= 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "224": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q1, q3] > 1 + (g - 1) / 2) | q3 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "225": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 1) | q4 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "226": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] % 2 = 0) | q4 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "227": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] <= 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "228": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q1, q4] > 1 + (g - 1) / 2) | q4 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "229": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 1) | q5 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "230": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] % 2 = 0) | q5 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "231": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] <= 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "232": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q1, q5] > 1 + (g - 1) / 2) | q5 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "233": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 1) | q6 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "234": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] % 2 = 0) | q6 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "235": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] <= 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "236": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q1, q6] > 1 + (g - 1) / 2) | q6 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "237": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 1) | q7 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "238": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] % 2 = 0) | q7 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "239": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] <= 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "240": {"onVariable": "CA", + "groups": ["MatrixByRowBucket-9", "MatrixCardinality", + "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q1, q7] > 1 + (g - 1) / 2) | q7 : int(1..b)]) | q1 : int(1 + 9 * ((k - 1 + 1) / 10)..min([k, 1 + (9 + 1) * ((k - 1 + 1) / 10); int(1..2)]))])"}, + "241": {"onVariable": "CA", + "groups": ["MatrixByColBucket-0", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 1 | q9 : int(1 + 0 * ((b - 1 + 1) / 10)..min([b, 1 + (0 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "242": {"onVariable": "CA", + "groups": ["MatrixByColBucket-0", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 0 | q9 : int(1 + 0 * ((b - 1 + 1) / 10)..min([b, 1 + (0 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "243": {"onVariable": "CA", + "groups": ["MatrixByColBucket-0", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] <= 1 + (g - 1) / 2 | q9 : int(1 + 0 * ((b - 1 + 1) / 10)..min([b, 1 + (0 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "244": {"onVariable": "CA", + "groups": ["MatrixByColBucket-0", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] > 1 + (g - 1) / 2 | q9 : int(1 + 0 * ((b - 1 + 1) / 10)..min([b, 1 + (0 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "245": {"onVariable": "CA", + "groups": ["MatrixByColBucket-1", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 1 | q9 : int(1 + 1 * ((b - 1 + 1) / 10)..min([b, 1 + (1 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "246": {"onVariable": "CA", + "groups": ["MatrixByColBucket-1", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 0 | q9 : int(1 + 1 * ((b - 1 + 1) / 10)..min([b, 1 + (1 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "247": {"onVariable": "CA", + "groups": ["MatrixByColBucket-1", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] <= 1 + (g - 1) / 2 | q9 : int(1 + 1 * ((b - 1 + 1) / 10)..min([b, 1 + (1 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "248": {"onVariable": "CA", + "groups": ["MatrixByColBucket-1", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] > 1 + (g - 1) / 2 | q9 : int(1 + 1 * ((b - 1 + 1) / 10)..min([b, 1 + (1 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "249": {"onVariable": "CA", + "groups": ["MatrixByColBucket-2", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 1 | q9 : int(1 + 2 * ((b - 1 + 1) / 10)..min([b, 1 + (2 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "250": {"onVariable": "CA", + "groups": ["MatrixByColBucket-2", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 0 | q9 : int(1 + 2 * ((b - 1 + 1) / 10)..min([b, 1 + (2 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "251": {"onVariable": "CA", + "groups": ["MatrixByColBucket-2", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] <= 1 + (g - 1) / 2 | q9 : int(1 + 2 * ((b - 1 + 1) / 10)..min([b, 1 + (2 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "252": {"onVariable": "CA", + "groups": ["MatrixByColBucket-2", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] > 1 + (g - 1) / 2 | q9 : int(1 + 2 * ((b - 1 + 1) / 10)..min([b, 1 + (2 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "253": {"onVariable": "CA", + "groups": ["MatrixByColBucket-3", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 1 | q9 : int(1 + 3 * ((b - 1 + 1) / 10)..min([b, 1 + (3 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "254": {"onVariable": "CA", + "groups": ["MatrixByColBucket-3", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 0 | q9 : int(1 + 3 * ((b - 1 + 1) / 10)..min([b, 1 + (3 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "255": {"onVariable": "CA", + "groups": ["MatrixByColBucket-3", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] <= 1 + (g - 1) / 2 | q9 : int(1 + 3 * ((b - 1 + 1) / 10)..min([b, 1 + (3 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "256": {"onVariable": "CA", + "groups": ["MatrixByColBucket-3", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] > 1 + (g - 1) / 2 | q9 : int(1 + 3 * ((b - 1 + 1) / 10)..min([b, 1 + (3 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "257": {"onVariable": "CA", + "groups": ["MatrixByColBucket-4", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 1 | q9 : int(1 + 4 * ((b - 1 + 1) / 10)..min([b, 1 + (4 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "258": {"onVariable": "CA", + "groups": ["MatrixByColBucket-4", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 0 | q9 : int(1 + 4 * ((b - 1 + 1) / 10)..min([b, 1 + (4 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "259": {"onVariable": "CA", + "groups": ["MatrixByColBucket-4", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] <= 1 + (g - 1) / 2 | q9 : int(1 + 4 * ((b - 1 + 1) / 10)..min([b, 1 + (4 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "260": {"onVariable": "CA", + "groups": ["MatrixByColBucket-4", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] > 1 + (g - 1) / 2 | q9 : int(1 + 4 * ((b - 1 + 1) / 10)..min([b, 1 + (4 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "261": {"onVariable": "CA", + "groups": ["MatrixByColBucket-5", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 1 | q9 : int(1 + 5 * ((b - 1 + 1) / 10)..min([b, 1 + (5 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "262": {"onVariable": "CA", + "groups": ["MatrixByColBucket-5", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 0 | q9 : int(1 + 5 * ((b - 1 + 1) / 10)..min([b, 1 + (5 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "263": {"onVariable": "CA", + "groups": ["MatrixByColBucket-5", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] <= 1 + (g - 1) / 2 | q9 : int(1 + 5 * ((b - 1 + 1) / 10)..min([b, 1 + (5 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "264": {"onVariable": "CA", + "groups": ["MatrixByColBucket-5", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] > 1 + (g - 1) / 2 | q9 : int(1 + 5 * ((b - 1 + 1) / 10)..min([b, 1 + (5 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "265": {"onVariable": "CA", + "groups": ["MatrixByColBucket-6", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 1 | q9 : int(1 + 6 * ((b - 1 + 1) / 10)..min([b, 1 + (6 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "266": {"onVariable": "CA", + "groups": ["MatrixByColBucket-6", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 0 | q9 : int(1 + 6 * ((b - 1 + 1) / 10)..min([b, 1 + (6 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "267": {"onVariable": "CA", + "groups": ["MatrixByColBucket-6", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] <= 1 + (g - 1) / 2 | q9 : int(1 + 6 * ((b - 1 + 1) / 10)..min([b, 1 + (6 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "268": {"onVariable": "CA", + "groups": ["MatrixByColBucket-6", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] > 1 + (g - 1) / 2 | q9 : int(1 + 6 * ((b - 1 + 1) / 10)..min([b, 1 + (6 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "269": {"onVariable": "CA", + "groups": ["MatrixByColBucket-7", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 1 | q9 : int(1 + 7 * ((b - 1 + 1) / 10)..min([b, 1 + (7 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "270": {"onVariable": "CA", + "groups": ["MatrixByColBucket-7", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 0 | q9 : int(1 + 7 * ((b - 1 + 1) / 10)..min([b, 1 + (7 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "271": {"onVariable": "CA", + "groups": ["MatrixByColBucket-7", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] <= 1 + (g - 1) / 2 | q9 : int(1 + 7 * ((b - 1 + 1) / 10)..min([b, 1 + (7 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "272": {"onVariable": "CA", + "groups": ["MatrixByColBucket-7", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] > 1 + (g - 1) / 2 | q9 : int(1 + 7 * ((b - 1 + 1) / 10)..min([b, 1 + (7 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "273": {"onVariable": "CA", + "groups": ["MatrixByColBucket-8", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 1 | q9 : int(1 + 8 * ((b - 1 + 1) / 10)..min([b, 1 + (8 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "274": {"onVariable": "CA", + "groups": ["MatrixByColBucket-8", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 0 | q9 : int(1 + 8 * ((b - 1 + 1) / 10)..min([b, 1 + (8 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "275": {"onVariable": "CA", + "groups": ["MatrixByColBucket-8", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] <= 1 + (g - 1) / 2 | q9 : int(1 + 8 * ((b - 1 + 1) / 10)..min([b, 1 + (8 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "276": {"onVariable": "CA", + "groups": ["MatrixByColBucket-8", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] > 1 + (g - 1) / 2 | q9 : int(1 + 8 * ((b - 1 + 1) / 10)..min([b, 1 + (8 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "277": {"onVariable": "CA", + "groups": ["MatrixByColBucket-9", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 1 | q9 : int(1 + 9 * ((b - 1 + 1) / 10)..min([b, 1 + (9 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "278": {"onVariable": "CA", + "groups": ["MatrixByColBucket-9", "IntOddEven"], + "constraint": "and([and([CA[q8, q9] % 2 = 0 | q9 : int(1 + 9 * ((b - 1 + 1) / 10)..min([b, 1 + (9 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "279": {"onVariable": "CA", + "groups": ["MatrixByColBucket-9", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] <= 1 + (g - 1) / 2 | q9 : int(1 + 9 * ((b - 1 + 1) / 10)..min([b, 1 + (9 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "280": {"onVariable": "CA", + "groups": ["MatrixByColBucket-9", "IntLowHigh"], + "constraint": "and([and([CA[q8, q9] > 1 + (g - 1) / 2 | q9 : int(1 + 9 * ((b - 1 + 1) / 10)..min([b, 1 + (9 + 1) * ((b - 1 + 1) / 10); int(1..2)]))]) | q8 : int(1..k)])"}, + "281": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "and([and([CA[q10, q11] % 2 = 1 | q11 : int(1..b)]) | q10 : int(1..k)])"}, + "282": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "and([and([CA[q10, q11] % 2 = 0 | q11 : int(1..b)]) | q10 : int(1..k)])"}, + "283": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "and([and([CA[q10, q11] <= 1 + (g - 1) / 2 | q11 : int(1..b)]) | q10 : int(1..k)])"}, + "284": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "and([and([CA[q10, q11] > 1 + (g - 1) / 2 | q11 : int(1..b)]) | q10 : int(1..k)])"}, + "285": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q10, q12] % 2 = 1) | q12 : int(1..b)]) | q10 : int(1..k)])"}, + "286": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q10, q12] % 2 = 0) | q12 : int(1..b)]) | q10 : int(1..k)])"}, + "287": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q10, q12] <= 1 + (g - 1) / 2) | q12 : int(1..b)]) | q10 : int(1..k)])"}, + "288": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 = sum([toInt(CA[q10, q12] > 1 + (g - 1) / 2) | q12 : int(1..b)]) | q10 : int(1..k)])"}, + "289": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q10, q13] % 2 = 1) | q13 : int(1..b)]) | q10 : int(1..k)])"}, + "290": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "and([1 >= sum([toInt(CA[q10, q13] % 2 = 0) | q13 : int(1..b)]) | q10 : int(1..k)])"}, + "291": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q10, q13] <= 1 + (g - 1) / 2) | q13 : int(1..b)]) | q10 : int(1..k)])"}, + "292": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "and([1 >= sum([toInt(CA[q10, q13] > 1 + (g - 1) / 2) | q13 : int(1..b)]) | q10 : int(1..k)])"}, + "293": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q10, q14] % 2 = 1) | q14 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q10, q14] % 2 = 1) | q14 : int(1..b)]) | q10 : int(1..k)])"}, + "294": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q10, q14] % 2 = 0) | q14 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q10, q14] % 2 = 0) | q14 : int(1..b)]) | q10 : int(1..k)])"}, + "295": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q10, q14] <= 1 + (g - 1) / 2) | q14 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q10, q14] <= 1 + (g - 1) / 2) | q14 : int(1..b)]) | q10 : int(1..k)])"}, + "296": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q10, q14] > 1 + (g - 1) / 2) | q14 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q10, q14] > 1 + (g - 1) / 2) | q14 : int(1..b)]) | q10 : int(1..k)])"}, + "297": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q10, q15] % 2 = 1) | q15 : int(1..b)]) | q10 : int(1..k)])"}, + "298": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q10, q15] % 2 = 0) | q15 : int(1..b)]) | q10 : int(1..k)])"}, + "299": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q10, q15] <= 1 + (g - 1) / 2) | q15 : int(1..b)]) | q10 : int(1..k)])"}, + "300": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 <= sum([toInt(CA[q10, q15] > 1 + (g - 1) / 2) | q15 : int(1..b)]) | q10 : int(1..k)])"}, + "301": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q10, q16] % 2 = 1) | q16 : int(1..b)]) | q10 : int(1..k)])"}, + "302": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q10, q16] % 2 = 0) | q16 : int(1..b)]) | q10 : int(1..k)])"}, + "303": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q10, q16] <= 1 + (g - 1) / 2) | q16 : int(1..b)]) | q10 : int(1..k)])"}, + "304": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "and([|`int(1..b)`| / 2 >= sum([toInt(CA[q10, q16] > 1 + (g - 1) / 2) | q16 : int(1..b)]) | q10 : int(1..k)])"}, + "305": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(and([CA[q17, q18] % 2 = 1 | q18 : int(1..b)])) | q17 : int(1..k)])"}, + "306": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(and([CA[q17, q18] % 2 = 0 | q18 : int(1..b)])) | q17 : int(1..k)])"}, + "307": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(and([CA[q17, q18] <= 1 + (g - 1) / 2 | q18 : int(1..b)])) | q17 : int(1..k)])"}, + "308": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(and([CA[q17, q18] > 1 + (g - 1) / 2 | q18 : int(1..b)])) | q17 : int(1..k)])"}, + "309": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q17, q19] % 2 = 1) | q19 : int(1..b)])) | q17 : int(1..k)])"}, + "310": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q17, q19] % 2 = 0) | q19 : int(1..b)])) | q17 : int(1..k)])"}, + "311": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q17, q19] <= 1 + (g - 1) / 2) | q19 : int(1..b)])) | q17 : int(1..k)])"}, + "312": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q17, q19] > 1 + (g - 1) / 2) | q19 : int(1..b)])) | q17 : int(1..k)])"}, + "313": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(1 >= sum([toInt(CA[q17, q20] % 2 = 1) | q20 : int(1..b)])) | q17 : int(1..k)])"}, + "314": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(1 >= sum([toInt(CA[q17, q20] % 2 = 0) | q20 : int(1..b)])) | q17 : int(1..k)])"}, + "315": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(1 >= sum([toInt(CA[q17, q20] <= 1 + (g - 1) / 2) | q20 : int(1..b)])) | q17 : int(1..k)])"}, + "316": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(1 >= sum([toInt(CA[q17, q20] > 1 + (g - 1) / 2) | q20 : int(1..b)])) | q17 : int(1..k)])"}, + "317": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q17, q21] % 2 = 1) | q21 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q17, q21] % 2 = 1) | q21 : int(1..b)])) | q17 : int(1..k)])"}, + "318": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q17, q21] % 2 = 0) | q21 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q17, q21] % 2 = 0) | q21 : int(1..b)])) | q17 : int(1..k)])"}, + "319": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q17, q21] <= 1 + (g - 1) / 2) | q21 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q17, q21] <= 1 + (g - 1) / 2) | q21 : int(1..b)])) | q17 : int(1..k)])"}, + "320": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q17, q21] > 1 + (g - 1) / 2) | q21 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q17, q21] > 1 + (g - 1) / 2) | q21 : int(1..b)])) | q17 : int(1..k)])"}, + "321": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q17, q22] % 2 = 1) | q22 : int(1..b)])) | q17 : int(1..k)])"}, + "322": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q17, q22] % 2 = 0) | q22 : int(1..b)])) | q17 : int(1..k)])"}, + "323": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q17, q22] <= 1 + (g - 1) / 2) | q22 : int(1..b)])) | q17 : int(1..k)])"}, + "324": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q17, q22] > 1 + (g - 1) / 2) | q22 : int(1..b)])) | q17 : int(1..k)])"}, + "325": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q17, q23] % 2 = 1) | q23 : int(1..b)])) | q17 : int(1..k)])"}, + "326": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q17, q23] % 2 = 0) | q23 : int(1..b)])) | q17 : int(1..k)])"}, + "327": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q17, q23] <= 1 + (g - 1) / 2) | q23 : int(1..b)])) | q17 : int(1..k)])"}, + "328": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 = sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q17, q23] > 1 + (g - 1) / 2) | q23 : int(1..b)])) | q17 : int(1..k)])"}, + "329": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "1 >= sum([toInt(and([CA[q24, q25] % 2 = 1 | q25 : int(1..b)])) | q24 : int(1..k)])"}, + "330": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "1 >= sum([toInt(and([CA[q24, q25] % 2 = 0 | q25 : int(1..b)])) | q24 : int(1..k)])"}, + "331": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "1 >= sum([toInt(and([CA[q24, q25] <= 1 + (g - 1) / 2 | q25 : int(1..b)])) | q24 : int(1..k)])"}, + "332": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "1 >= sum([toInt(and([CA[q24, q25] > 1 + (g - 1) / 2 | q25 : int(1..b)])) | q24 : int(1..k)])"}, + "333": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q24, q26] % 2 = 1) | q26 : int(1..b)])) | q24 : int(1..k)])"}, + "334": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q24, q26] % 2 = 0) | q26 : int(1..b)])) | q24 : int(1..k)])"}, + "335": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q24, q26] <= 1 + (g - 1) / 2) | q26 : int(1..b)])) | q24 : int(1..k)])"}, + "336": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q24, q26] > 1 + (g - 1) / 2) | q26 : int(1..b)])) | q24 : int(1..k)])"}, + "337": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "1 >= sum([toInt(1 >= sum([toInt(CA[q24, q27] % 2 = 1) | q27 : int(1..b)])) | q24 : int(1..k)])"}, + "338": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "1 >= sum([toInt(1 >= sum([toInt(CA[q24, q27] % 2 = 0) | q27 : int(1..b)])) | q24 : int(1..k)])"}, + "339": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "1 >= sum([toInt(1 >= sum([toInt(CA[q24, q27] <= 1 + (g - 1) / 2) | q27 : int(1..b)])) | q24 : int(1..k)])"}, + "340": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "1 >= sum([toInt(1 >= sum([toInt(CA[q24, q27] > 1 + (g - 1) / 2) | q27 : int(1..b)])) | q24 : int(1..k)])"}, + "341": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q24, q28] % 2 = 1) | q28 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q24, q28] % 2 = 1) | q28 : int(1..b)])) | q24 : int(1..k)])"}, + "342": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q24, q28] % 2 = 0) | q28 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q24, q28] % 2 = 0) | q28 : int(1..b)])) | q24 : int(1..k)])"}, + "343": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q24, q28] <= 1 + (g - 1) / 2) | q28 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q24, q28] <= 1 + (g - 1) / 2) | q28 : int(1..b)])) | q24 : int(1..k)])"}, + "344": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q24, q28] > 1 + (g - 1) / 2) | q28 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q24, q28] > 1 + (g - 1) / 2) | q28 : int(1..b)])) | q24 : int(1..k)])"}, + "345": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q24, q29] % 2 = 1) | q29 : int(1..b)])) | q24 : int(1..k)])"}, + "346": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q24, q29] % 2 = 0) | q29 : int(1..b)])) | q24 : int(1..k)])"}, + "347": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q24, q29] <= 1 + (g - 1) / 2) | q29 : int(1..b)])) | q24 : int(1..k)])"}, + "348": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q24, q29] > 1 + (g - 1) / 2) | q29 : int(1..b)])) | q24 : int(1..k)])"}, + "349": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q24, q30] % 2 = 1) | q30 : int(1..b)])) | q24 : int(1..k)])"}, + "350": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q24, q30] % 2 = 0) | q30 : int(1..b)])) | q24 : int(1..k)])"}, + "351": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q24, q30] <= 1 + (g - 1) / 2) | q30 : int(1..b)])) | q24 : int(1..k)])"}, + "352": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "1 >= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q24, q30] > 1 + (g - 1) / 2) | q30 : int(1..b)])) | q24 : int(1..k)])"}, + "353": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(and([CA[q31, q32] % 2 = 1 | q32 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(and([CA[q31, q32] % 2 = 1 | q32 : int(1..b)])) | q31 : int(1..k)])"}, + "354": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(and([CA[q31, q32] % 2 = 0 | q32 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(and([CA[q31, q32] % 2 = 0 | q32 : int(1..b)])) | q31 : int(1..k)])"}, + "355": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(and([CA[q31, q32] <= 1 + (g - 1) / 2 | q32 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(and([CA[q31, q32] <= 1 + (g - 1) / 2 | q32 : int(1..b)])) | q31 : int(1..k)])"}, + "356": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(and([CA[q31, q32] > 1 + (g - 1) / 2 | q32 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(and([CA[q31, q32] > 1 + (g - 1) / 2 | q32 : int(1..b)])) | q31 : int(1..k)])"}, + "357": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q31, q33] % 2 = 1) | q33 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q31, q33] % 2 = 1) | q33 : int(1..b)])) | q31 : int(1..k)])"}, + "358": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q31, q33] % 2 = 0) | q33 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q31, q33] % 2 = 0) | q33 : int(1..b)])) | q31 : int(1..k)])"}, + "359": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q31, q33] <= 1 + (g - 1) / 2) | q33 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q31, q33] <= 1 + (g - 1) / 2) | q33 : int(1..b)])) | q31 : int(1..k)])"}, + "360": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q31, q33] > 1 + (g - 1) / 2) | q33 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q31, q33] > 1 + (g - 1) / 2) | q33 : int(1..b)])) | q31 : int(1..k)])"}, + "361": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(1 >= sum([toInt(CA[q31, q34] % 2 = 1) | q34 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(1 >= sum([toInt(CA[q31, q34] % 2 = 1) | q34 : int(1..b)])) | q31 : int(1..k)])"}, + "362": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(1 >= sum([toInt(CA[q31, q34] % 2 = 0) | q34 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(1 >= sum([toInt(CA[q31, q34] % 2 = 0) | q34 : int(1..b)])) | q31 : int(1..k)])"}, + "363": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(1 >= sum([toInt(CA[q31, q34] <= 1 + (g - 1) / 2) | q34 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(1 >= sum([toInt(CA[q31, q34] <= 1 + (g - 1) / 2) | q34 : int(1..b)])) | q31 : int(1..k)])"}, + "364": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(1 >= sum([toInt(CA[q31, q34] > 1 + (g - 1) / 2) | q34 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(1 >= sum([toInt(CA[q31, q34] > 1 + (g - 1) / 2) | q34 : int(1..b)])) | q31 : int(1..k)])"}, + "365": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q31, q35] % 2 = 1) | q35 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q31, q35] % 2 = 1) | q35 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q31, q35] % 2 = 1) | q35 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q31, q35] % 2 = 1) | q35 : int(1..b)])) | q31 : int(1..k)])"}, + "366": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q31, q35] % 2 = 0) | q35 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q31, q35] % 2 = 0) | q35 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q31, q35] % 2 = 0) | q35 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q31, q35] % 2 = 0) | q35 : int(1..b)])) | q31 : int(1..k)])"}, + "367": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q31, q35] <= 1 + (g - 1) / 2) | q35 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q31, q35] <= 1 + (g - 1) / 2) | q35 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q31, q35] <= 1 + (g - 1) / 2) | q35 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q31, q35] <= 1 + (g - 1) / 2) | q35 : int(1..b)])) | q31 : int(1..k)])"}, + "368": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q31, q35] > 1 + (g - 1) / 2) | q35 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q31, q35] > 1 + (g - 1) / 2) | q35 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q31, q35] > 1 + (g - 1) / 2) | q35 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q31, q35] > 1 + (g - 1) / 2) | q35 : int(1..b)])) | q31 : int(1..k)])"}, + "369": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q31, q36] % 2 = 1) | q36 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q31, q36] % 2 = 1) | q36 : int(1..b)])) | q31 : int(1..k)])"}, + "370": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q31, q36] % 2 = 0) | q36 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q31, q36] % 2 = 0) | q36 : int(1..b)])) | q31 : int(1..k)])"}, + "371": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q31, q36] <= 1 + (g - 1) / 2) | q36 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q31, q36] <= 1 + (g - 1) / 2) | q36 : int(1..b)])) | q31 : int(1..k)])"}, + "372": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q31, q36] > 1 + (g - 1) / 2) | q36 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q31, q36] > 1 + (g - 1) / 2) | q36 : int(1..b)])) | q31 : int(1..k)])"}, + "373": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q31, q37] % 2 = 1) | q37 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q31, q37] % 2 = 1) | q37 : int(1..b)])) | q31 : int(1..k)])"}, + "374": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q31, q37] % 2 = 0) | q37 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q31, q37] % 2 = 0) | q37 : int(1..b)])) | q31 : int(1..k)])"}, + "375": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q31, q37] <= 1 + (g - 1) / 2) | q37 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q31, q37] <= 1 + (g - 1) / 2) | q37 : int(1..b)])) | q31 : int(1..k)])"}, + "376": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 + 1 >= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q31, q37] > 1 + (g - 1) / 2) | q37 : int(1..b)])) | q31 : int(1..k)]) /\\ |`int(1..k)`| / 2 - 1 <= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q31, q37] > 1 + (g - 1) / 2) | q37 : int(1..b)])) | q31 : int(1..k)])"}, + "377": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(and([CA[q38, q39] % 2 = 1 | q39 : int(1..b)])) | q38 : int(1..k)])"}, + "378": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(and([CA[q38, q39] % 2 = 0 | q39 : int(1..b)])) | q38 : int(1..k)])"}, + "379": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(and([CA[q38, q39] <= 1 + (g - 1) / 2 | q39 : int(1..b)])) | q38 : int(1..k)])"}, + "380": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(and([CA[q38, q39] > 1 + (g - 1) / 2 | q39 : int(1..b)])) | q38 : int(1..k)])"}, + "381": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q38, q40] % 2 = 1) | q40 : int(1..b)])) | q38 : int(1..k)])"}, + "382": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q38, q40] % 2 = 0) | q40 : int(1..b)])) | q38 : int(1..k)])"}, + "383": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q38, q40] <= 1 + (g - 1) / 2) | q40 : int(1..b)])) | q38 : int(1..k)])"}, + "384": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q38, q40] > 1 + (g - 1) / 2) | q40 : int(1..b)])) | q38 : int(1..k)])"}, + "385": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(1 >= sum([toInt(CA[q38, q41] % 2 = 1) | q41 : int(1..b)])) | q38 : int(1..k)])"}, + "386": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(1 >= sum([toInt(CA[q38, q41] % 2 = 0) | q41 : int(1..b)])) | q38 : int(1..k)])"}, + "387": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(1 >= sum([toInt(CA[q38, q41] <= 1 + (g - 1) / 2) | q41 : int(1..b)])) | q38 : int(1..k)])"}, + "388": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(1 >= sum([toInt(CA[q38, q41] > 1 + (g - 1) / 2) | q41 : int(1..b)])) | q38 : int(1..k)])"}, + "389": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q38, q42] % 2 = 1) | q42 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q38, q42] % 2 = 1) | q42 : int(1..b)])) | q38 : int(1..k)])"}, + "390": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q38, q42] % 2 = 0) | q42 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q38, q42] % 2 = 0) | q42 : int(1..b)])) | q38 : int(1..k)])"}, + "391": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q38, q42] <= 1 + (g - 1) / 2) | q42 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q38, q42] <= 1 + (g - 1) / 2) | q42 : int(1..b)])) | q38 : int(1..k)])"}, + "392": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q38, q42] > 1 + (g - 1) / 2) | q42 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q38, q42] > 1 + (g - 1) / 2) | q42 : int(1..b)])) | q38 : int(1..k)])"}, + "393": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q38, q43] % 2 = 1) | q43 : int(1..b)])) | q38 : int(1..k)])"}, + "394": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q38, q43] % 2 = 0) | q43 : int(1..b)])) | q38 : int(1..k)])"}, + "395": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q38, q43] <= 1 + (g - 1) / 2) | q43 : int(1..b)])) | q38 : int(1..k)])"}, + "396": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q38, q43] > 1 + (g - 1) / 2) | q43 : int(1..b)])) | q38 : int(1..k)])"}, + "397": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q38, q44] % 2 = 1) | q44 : int(1..b)])) | q38 : int(1..k)])"}, + "398": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q38, q44] % 2 = 0) | q44 : int(1..b)])) | q38 : int(1..k)])"}, + "399": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q38, q44] <= 1 + (g - 1) / 2) | q44 : int(1..b)])) | q38 : int(1..k)])"}, + "400": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 <= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q38, q44] > 1 + (g - 1) / 2) | q44 : int(1..b)])) | q38 : int(1..k)])"}, + "401": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(and([CA[q45, q46] % 2 = 1 | q46 : int(1..b)])) | q45 : int(1..k)])"}, + "402": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(and([CA[q45, q46] % 2 = 0 | q46 : int(1..b)])) | q45 : int(1..k)])"}, + "403": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(and([CA[q45, q46] <= 1 + (g - 1) / 2 | q46 : int(1..b)])) | q45 : int(1..k)])"}, + "404": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(and([CA[q45, q46] > 1 + (g - 1) / 2 | q46 : int(1..b)])) | q45 : int(1..k)])"}, + "405": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q45, q47] % 2 = 1) | q47 : int(1..b)])) | q45 : int(1..k)])"}, + "406": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q45, q47] % 2 = 0) | q47 : int(1..b)])) | q45 : int(1..k)])"}, + "407": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q45, q47] <= 1 + (g - 1) / 2) | q47 : int(1..b)])) | q45 : int(1..k)])"}, + "408": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 = sum([toInt(CA[q45, q47] > 1 + (g - 1) / 2) | q47 : int(1..b)])) | q45 : int(1..k)])"}, + "409": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(1 >= sum([toInt(CA[q45, q48] % 2 = 1) | q48 : int(1..b)])) | q45 : int(1..k)])"}, + "410": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(1 >= sum([toInt(CA[q45, q48] % 2 = 0) | q48 : int(1..b)])) | q45 : int(1..k)])"}, + "411": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(1 >= sum([toInt(CA[q45, q48] <= 1 + (g - 1) / 2) | q48 : int(1..b)])) | q45 : int(1..k)])"}, + "412": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(1 >= sum([toInt(CA[q45, q48] > 1 + (g - 1) / 2) | q48 : int(1..b)])) | q45 : int(1..k)])"}, + "413": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q45, q49] % 2 = 1) | q49 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q45, q49] % 2 = 1) | q49 : int(1..b)])) | q45 : int(1..k)])"}, + "414": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q45, q49] % 2 = 0) | q49 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q45, q49] % 2 = 0) | q49 : int(1..b)])) | q45 : int(1..k)])"}, + "415": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q45, q49] <= 1 + (g - 1) / 2) | q49 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q45, q49] <= 1 + (g - 1) / 2) | q49 : int(1..b)])) | q45 : int(1..k)])"}, + "416": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 + 1 >= sum([toInt(CA[q45, q49] > 1 + (g - 1) / 2) | q49 : int(1..b)]) /\\ |`int(1..b)`| / 2 - 1 <= sum([toInt(CA[q45, q49] > 1 + (g - 1) / 2) | q49 : int(1..b)])) | q45 : int(1..k)])"}, + "417": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q45, q50] % 2 = 1) | q50 : int(1..b)])) | q45 : int(1..k)])"}, + "418": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q45, q50] % 2 = 0) | q50 : int(1..b)])) | q45 : int(1..k)])"}, + "419": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q45, q50] <= 1 + (g - 1) / 2) | q50 : int(1..b)])) | q45 : int(1..k)])"}, + "420": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 <= sum([toInt(CA[q45, q50] > 1 + (g - 1) / 2) | q50 : int(1..b)])) | q45 : int(1..k)])"}, + "421": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q45, q51] % 2 = 1) | q51 : int(1..b)])) | q45 : int(1..k)])"}, + "422": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntOddEven"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q45, q51] % 2 = 0) | q51 : int(1..b)])) | q45 : int(1..k)])"}, + "423": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q45, q51] <= 1 + (g - 1) / 2) | q51 : int(1..b)])) | q45 : int(1..k)])"}, + "424": {"onVariable": "CA", + "groups": ["MatrixCardinality", "IntLowHigh"], + "constraint": "|`int(1..k)`| / 2 >= sum([toInt(|`int(1..b)`| / 2 >= sum([toInt(CA[q45, q51] > 1 + (g - 1) / 2) | q51 : int(1..b)])) | q45 : int(1..k)])"}} diff --git a/tests/custom/streamlining/int_01/stdout.expected b/tests/custom/streamlining/int_01/stdout.expected index e194bc4329..7e81f43ff2 100644 --- a/tests/custom/streamlining/int_01/stdout.expected +++ b/tests/custom/streamlining/int_01/stdout.expected @@ -6,7 +6,7 @@ "constraint": "a % 2 = 0"}, "3": {"onVariable": "a", "groups": ["IntLowHigh"], - "constraint": "a < 1 + (10 - 1) / 2"}, + "constraint": "a <= 1 + (10 - 1) / 2"}, "4": {"onVariable": "a", "groups": ["IntLowHigh"], "constraint": "a > 1 + (10 - 1) / 2"}, @@ -18,7 +18,7 @@ "constraint": "b % 2 = 0"}, "7": {"onVariable": "b", "groups": ["IntLowHigh"], - "constraint": "b < 1 + (10 - 1) / 2"}, + "constraint": "b <= 1 + (10 - 1) / 2"}, "8": {"onVariable": "b", "groups": ["IntLowHigh"], "constraint": "b > 1 + (10 - 1) / 2"}, @@ -30,7 +30,7 @@ "constraint": "c % 2 = 0"}, "11": {"onVariable": "c", "groups": ["IntLowHigh"], - "constraint": "c < 1 + (10 - 1) / 2"}, + "constraint": "c <= 1 + (10 - 1) / 2"}, "12": {"onVariable": "c", "groups": ["IntLowHigh"], "constraint": "c > 1 + (10 - 1) / 2"}, @@ -42,7 +42,7 @@ "constraint": "and([q1 % 2 = 0 | q1 <- x])"}, "15": {"onVariable": "x", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "and([q1 < 1 + (3 - 1) / 2 | q1 <- x])"}, + "constraint": "and([q1 <= 1 + (3 - 1) / 2 | q1 <- x])"}, "16": {"onVariable": "x", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "and([q1 > 1 + (3 - 1) / 2 | q1 <- x])"}, @@ -54,7 +54,7 @@ "constraint": "|x| / 2 = sum([toInt(q2 % 2 = 0) | q2 <- x])"}, "19": {"onVariable": "x", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "|x| / 2 = sum([toInt(q2 < 1 + (3 - 1) / 2) | q2 <- x])"}, + "constraint": "|x| / 2 = sum([toInt(q2 <= 1 + (3 - 1) / 2) | q2 <- x])"}, "20": {"onVariable": "x", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "|x| / 2 = sum([toInt(q2 > 1 + (3 - 1) / 2) | q2 <- x])"}, @@ -66,7 +66,7 @@ "constraint": "1 >= sum([toInt(q3 % 2 = 0) | q3 <- x])"}, "23": {"onVariable": "x", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "1 >= sum([toInt(q3 < 1 + (3 - 1) / 2) | q3 <- x])"}, + "constraint": "1 >= sum([toInt(q3 <= 1 + (3 - 1) / 2) | q3 <- x])"}, "24": {"onVariable": "x", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "1 >= sum([toInt(q3 > 1 + (3 - 1) / 2) | q3 <- x])"}, @@ -78,7 +78,7 @@ "constraint": "|x| / 2 + 1 >= sum([toInt(q4 % 2 = 0) | q4 <- x]) /\\ |x| / 2 - 1 <= sum([toInt(q4 % 2 = 0) | q4 <- x])"}, "27": {"onVariable": "x", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "|x| / 2 + 1 >= sum([toInt(q4 < 1 + (3 - 1) / 2) | q4 <- x]) /\\ |x| / 2 - 1 <= sum([toInt(q4 < 1 + (3 - 1) / 2) | q4 <- x])"}, + "constraint": "|x| / 2 + 1 >= sum([toInt(q4 <= 1 + (3 - 1) / 2) | q4 <- x]) /\\ |x| / 2 - 1 <= sum([toInt(q4 <= 1 + (3 - 1) / 2) | q4 <- x])"}, "28": {"onVariable": "x", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "|x| / 2 + 1 >= sum([toInt(q4 > 1 + (3 - 1) / 2) | q4 <- x]) /\\ |x| / 2 - 1 <= sum([toInt(q4 > 1 + (3 - 1) / 2) | q4 <- x])"}, @@ -90,7 +90,7 @@ "constraint": "|x| / 2 <= sum([toInt(q5 % 2 = 0) | q5 <- x])"}, "31": {"onVariable": "x", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "|x| / 2 <= sum([toInt(q5 < 1 + (3 - 1) / 2) | q5 <- x])"}, + "constraint": "|x| / 2 <= sum([toInt(q5 <= 1 + (3 - 1) / 2) | q5 <- x])"}, "32": {"onVariable": "x", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "|x| / 2 <= sum([toInt(q5 > 1 + (3 - 1) / 2) | q5 <- x])"}, @@ -102,7 +102,7 @@ "constraint": "|x| / 2 >= sum([toInt(q6 % 2 = 0) | q6 <- x])"}, "35": {"onVariable": "x", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "|x| / 2 >= sum([toInt(q6 < 1 + (3 - 1) / 2) | q6 <- x])"}, + "constraint": "|x| / 2 >= sum([toInt(q6 <= 1 + (3 - 1) / 2) | q6 <- x])"}, "36": {"onVariable": "x", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "|x| / 2 >= sum([toInt(q6 > 1 + (3 - 1) / 2) | q6 <- x])"}, @@ -114,7 +114,7 @@ "constraint": "and([q7 % 2 = 0 | q7 <- y])"}, "39": {"onVariable": "y", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "and([q7 < 1 + (3 - 1) / 2 | q7 <- y])"}, + "constraint": "and([q7 <= 1 + (3 - 1) / 2 | q7 <- y])"}, "40": {"onVariable": "y", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "and([q7 > 1 + (3 - 1) / 2 | q7 <- y])"}, @@ -126,7 +126,7 @@ "constraint": "|y| / 2 = sum([toInt(q8 % 2 = 0) | q8 <- y])"}, "43": {"onVariable": "y", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "|y| / 2 = sum([toInt(q8 < 1 + (3 - 1) / 2) | q8 <- y])"}, + "constraint": "|y| / 2 = sum([toInt(q8 <= 1 + (3 - 1) / 2) | q8 <- y])"}, "44": {"onVariable": "y", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "|y| / 2 = sum([toInt(q8 > 1 + (3 - 1) / 2) | q8 <- y])"}, @@ -138,7 +138,7 @@ "constraint": "1 >= sum([toInt(q9 % 2 = 0) | q9 <- y])"}, "47": {"onVariable": "y", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "1 >= sum([toInt(q9 < 1 + (3 - 1) / 2) | q9 <- y])"}, + "constraint": "1 >= sum([toInt(q9 <= 1 + (3 - 1) / 2) | q9 <- y])"}, "48": {"onVariable": "y", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "1 >= sum([toInt(q9 > 1 + (3 - 1) / 2) | q9 <- y])"}, @@ -150,7 +150,7 @@ "constraint": "|y| / 2 + 1 >= sum([toInt(q10 % 2 = 0) | q10 <- y]) /\\ |y| / 2 - 1 <= sum([toInt(q10 % 2 = 0) | q10 <- y])"}, "51": {"onVariable": "y", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "|y| / 2 + 1 >= sum([toInt(q10 < 1 + (3 - 1) / 2) | q10 <- y]) /\\ |y| / 2 - 1 <= sum([toInt(q10 < 1 + (3 - 1) / 2) | q10 <- y])"}, + "constraint": "|y| / 2 + 1 >= sum([toInt(q10 <= 1 + (3 - 1) / 2) | q10 <- y]) /\\ |y| / 2 - 1 <= sum([toInt(q10 <= 1 + (3 - 1) / 2) | q10 <- y])"}, "52": {"onVariable": "y", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "|y| / 2 + 1 >= sum([toInt(q10 > 1 + (3 - 1) / 2) | q10 <- y]) /\\ |y| / 2 - 1 <= sum([toInt(q10 > 1 + (3 - 1) / 2) | q10 <- y])"}, @@ -162,7 +162,7 @@ "constraint": "|y| / 2 <= sum([toInt(q11 % 2 = 0) | q11 <- y])"}, "55": {"onVariable": "y", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "|y| / 2 <= sum([toInt(q11 < 1 + (3 - 1) / 2) | q11 <- y])"}, + "constraint": "|y| / 2 <= sum([toInt(q11 <= 1 + (3 - 1) / 2) | q11 <- y])"}, "56": {"onVariable": "y", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "|y| / 2 <= sum([toInt(q11 > 1 + (3 - 1) / 2) | q11 <- y])"}, @@ -174,7 +174,7 @@ "constraint": "|y| / 2 >= sum([toInt(q12 % 2 = 0) | q12 <- y])"}, "59": {"onVariable": "y", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "|y| / 2 >= sum([toInt(q12 < 1 + (3 - 1) / 2) | q12 <- y])"}, + "constraint": "|y| / 2 >= sum([toInt(q12 <= 1 + (3 - 1) / 2) | q12 <- y])"}, "60": {"onVariable": "y", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "|y| / 2 >= sum([toInt(q12 > 1 + (3 - 1) / 2) | q12 <- y])"}, @@ -186,7 +186,7 @@ "constraint": "and([q21 % 2 = 0 | q21 <- defined(f)])"}, "63": {"onVariable": "f", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "and([q21 < 1 + (2 - 1) / 2 | q21 <- defined(f)])"}, + "constraint": "and([q21 <= 1 + (2 - 1) / 2 | q21 <- defined(f)])"}, "64": {"onVariable": "f", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "and([q21 > 1 + (2 - 1) / 2 | q21 <- defined(f)])"}, @@ -198,7 +198,7 @@ "constraint": "|defined(f)| / 2 = sum([toInt(q22 % 2 = 0) | q22 <- defined(f)])"}, "67": {"onVariable": "f", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "|defined(f)| / 2 = sum([toInt(q22 < 1 + (2 - 1) / 2) | q22 <- defined(f)])"}, + "constraint": "|defined(f)| / 2 = sum([toInt(q22 <= 1 + (2 - 1) / 2) | q22 <- defined(f)])"}, "68": {"onVariable": "f", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "|defined(f)| / 2 = sum([toInt(q22 > 1 + (2 - 1) / 2) | q22 <- defined(f)])"}, @@ -210,7 +210,7 @@ "constraint": "1 >= sum([toInt(q23 % 2 = 0) | q23 <- defined(f)])"}, "71": {"onVariable": "f", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "1 >= sum([toInt(q23 < 1 + (2 - 1) / 2) | q23 <- defined(f)])"}, + "constraint": "1 >= sum([toInt(q23 <= 1 + (2 - 1) / 2) | q23 <- defined(f)])"}, "72": {"onVariable": "f", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "1 >= sum([toInt(q23 > 1 + (2 - 1) / 2) | q23 <- defined(f)])"}, @@ -222,7 +222,7 @@ "constraint": "|defined(f)| / 2 + 1 >= sum([toInt(q24 % 2 = 0) | q24 <- defined(f)]) /\\ |defined(f)| / 2 - 1 <= sum([toInt(q24 % 2 = 0) | q24 <- defined(f)])"}, "75": {"onVariable": "f", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "|defined(f)| / 2 + 1 >= sum([toInt(q24 < 1 + (2 - 1) / 2) | q24 <- defined(f)]) /\\ |defined(f)| / 2 - 1 <= sum([toInt(q24 < 1 + (2 - 1) / 2) | q24 <- defined(f)])"}, + "constraint": "|defined(f)| / 2 + 1 >= sum([toInt(q24 <= 1 + (2 - 1) / 2) | q24 <- defined(f)]) /\\ |defined(f)| / 2 - 1 <= sum([toInt(q24 <= 1 + (2 - 1) / 2) | q24 <- defined(f)])"}, "76": {"onVariable": "f", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "|defined(f)| / 2 + 1 >= sum([toInt(q24 > 1 + (2 - 1) / 2) | q24 <- defined(f)]) /\\ |defined(f)| / 2 - 1 <= sum([toInt(q24 > 1 + (2 - 1) / 2) | q24 <- defined(f)])"}, @@ -234,7 +234,7 @@ "constraint": "|defined(f)| / 2 <= sum([toInt(q25 % 2 = 0) | q25 <- defined(f)])"}, "79": {"onVariable": "f", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "|defined(f)| / 2 <= sum([toInt(q25 < 1 + (2 - 1) / 2) | q25 <- defined(f)])"}, + "constraint": "|defined(f)| / 2 <= sum([toInt(q25 <= 1 + (2 - 1) / 2) | q25 <- defined(f)])"}, "80": {"onVariable": "f", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "|defined(f)| / 2 <= sum([toInt(q25 > 1 + (2 - 1) / 2) | q25 <- defined(f)])"}, @@ -246,7 +246,7 @@ "constraint": "|defined(f)| / 2 >= sum([toInt(q26 % 2 = 0) | q26 <- defined(f)])"}, "83": {"onVariable": "f", "groups": ["SetCardinality", "IntLowHigh"], - "constraint": "|defined(f)| / 2 >= sum([toInt(q26 < 1 + (2 - 1) / 2) | q26 <- defined(f)])"}, + "constraint": "|defined(f)| / 2 >= sum([toInt(q26 <= 1 + (2 - 1) / 2) | q26 <- defined(f)])"}, "84": {"onVariable": "f", "groups": ["SetCardinality", "IntLowHigh"], "constraint": "|defined(f)| / 2 >= sum([toInt(q26 > 1 + (2 - 1) / 2) | q26 <- defined(f)])"}} diff --git a/tests/custom/streamlining/matrix_01/stdout.expected b/tests/custom/streamlining/matrix_01/stdout.expected index 02e834892f..207f75d76c 100644 --- a/tests/custom/streamlining/matrix_01/stdout.expected +++ b/tests/custom/streamlining/matrix_01/stdout.expected @@ -6,7 +6,7 @@ "constraint": "and([a[q1] % 2 = 0 | q1 : int(1..3)])"}, "3": {"onVariable": "a", "groups": ["MatrixCardinality", "IntLowHigh"], - "constraint": "and([a[q1] < 1 + (10 - 1) / 2 | q1 : int(1..3)])"}, + "constraint": "and([a[q1] <= 1 + (10 - 1) / 2 | q1 : int(1..3)])"}, "4": {"onVariable": "a", "groups": ["MatrixCardinality", "IntLowHigh"], "constraint": "and([a[q1] > 1 + (10 - 1) / 2 | q1 : int(1..3)])"}, @@ -18,7 +18,7 @@ "constraint": "|`int(1..3)`| / 2 = sum([toInt(a[q2] % 2 = 0) | q2 : int(1..3)])"}, "7": {"onVariable": "a", "groups": ["MatrixCardinality", "IntLowHigh"], - "constraint": "|`int(1..3)`| / 2 = sum([toInt(a[q2] < 1 + (10 - 1) / 2) | q2 : int(1..3)])"}, + "constraint": "|`int(1..3)`| / 2 = sum([toInt(a[q2] <= 1 + (10 - 1) / 2) | q2 : int(1..3)])"}, "8": {"onVariable": "a", "groups": ["MatrixCardinality", "IntLowHigh"], "constraint": "|`int(1..3)`| / 2 = sum([toInt(a[q2] > 1 + (10 - 1) / 2) | q2 : int(1..3)])"}, @@ -30,7 +30,7 @@ "constraint": "1 >= sum([toInt(a[q3] % 2 = 0) | q3 : int(1..3)])"}, "11": {"onVariable": "a", "groups": ["MatrixCardinality", "IntLowHigh"], - "constraint": "1 >= sum([toInt(a[q3] < 1 + (10 - 1) / 2) | q3 : int(1..3)])"}, + "constraint": "1 >= sum([toInt(a[q3] <= 1 + (10 - 1) / 2) | q3 : int(1..3)])"}, "12": {"onVariable": "a", "groups": ["MatrixCardinality", "IntLowHigh"], "constraint": "1 >= sum([toInt(a[q3] > 1 + (10 - 1) / 2) | q3 : int(1..3)])"}, @@ -42,7 +42,7 @@ "constraint": "|`int(1..3)`| / 2 + 1 >= sum([toInt(a[q4] % 2 = 0) | q4 : int(1..3)]) /\\ |`int(1..3)`| / 2 - 1 <= sum([toInt(a[q4] % 2 = 0) | q4 : int(1..3)])"}, "15": {"onVariable": "a", "groups": ["MatrixCardinality", "IntLowHigh"], - "constraint": "|`int(1..3)`| / 2 + 1 >= sum([toInt(a[q4] < 1 + (10 - 1) / 2) | q4 : int(1..3)]) /\\ |`int(1..3)`| / 2 - 1 <= sum([toInt(a[q4] < 1 + (10 - 1) / 2) | q4 : int(1..3)])"}, + "constraint": "|`int(1..3)`| / 2 + 1 >= sum([toInt(a[q4] <= 1 + (10 - 1) / 2) | q4 : int(1..3)]) /\\ |`int(1..3)`| / 2 - 1 <= sum([toInt(a[q4] <= 1 + (10 - 1) / 2) | q4 : int(1..3)])"}, "16": {"onVariable": "a", "groups": ["MatrixCardinality", "IntLowHigh"], "constraint": "|`int(1..3)`| / 2 + 1 >= sum([toInt(a[q4] > 1 + (10 - 1) / 2) | q4 : int(1..3)]) /\\ |`int(1..3)`| / 2 - 1 <= sum([toInt(a[q4] > 1 + (10 - 1) / 2) | q4 : int(1..3)])"}, @@ -54,7 +54,7 @@ "constraint": "|`int(1..3)`| / 2 <= sum([toInt(a[q5] % 2 = 0) | q5 : int(1..3)])"}, "19": {"onVariable": "a", "groups": ["MatrixCardinality", "IntLowHigh"], - "constraint": "|`int(1..3)`| / 2 <= sum([toInt(a[q5] < 1 + (10 - 1) / 2) | q5 : int(1..3)])"}, + "constraint": "|`int(1..3)`| / 2 <= sum([toInt(a[q5] <= 1 + (10 - 1) / 2) | q5 : int(1..3)])"}, "20": {"onVariable": "a", "groups": ["MatrixCardinality", "IntLowHigh"], "constraint": "|`int(1..3)`| / 2 <= sum([toInt(a[q5] > 1 + (10 - 1) / 2) | q5 : int(1..3)])"}, @@ -66,7 +66,7 @@ "constraint": "|`int(1..3)`| / 2 >= sum([toInt(a[q6] % 2 = 0) | q6 : int(1..3)])"}, "23": {"onVariable": "a", "groups": ["MatrixCardinality", "IntLowHigh"], - "constraint": "|`int(1..3)`| / 2 >= sum([toInt(a[q6] < 1 + (10 - 1) / 2) | q6 : int(1..3)])"}, + "constraint": "|`int(1..3)`| / 2 >= sum([toInt(a[q6] <= 1 + (10 - 1) / 2) | q6 : int(1..3)])"}, "24": {"onVariable": "a", "groups": ["MatrixCardinality", "IntLowHigh"], "constraint": "|`int(1..3)`| / 2 >= sum([toInt(a[q6] > 1 + (10 - 1) / 2) | q6 : int(1..3)])"}} diff --git a/tests/custom/streamlining/mset_01/stdout.expected b/tests/custom/streamlining/mset_01/stdout.expected index 35369a7c4d..8988e5288a 100644 --- a/tests/custom/streamlining/mset_01/stdout.expected +++ b/tests/custom/streamlining/mset_01/stdout.expected @@ -6,7 +6,7 @@ "constraint": "and([q1 % 2 = 0 | q1 <- a])"}, "3": {"onVariable": "a", "groups": ["MSetCardinality", "IntLowHigh"], - "constraint": "and([q1 < 1 + (10 - 1) / 2 | q1 <- a])"}, + "constraint": "and([q1 <= 1 + (10 - 1) / 2 | q1 <- a])"}, "4": {"onVariable": "a", "groups": ["MSetCardinality", "IntLowHigh"], "constraint": "and([q1 > 1 + (10 - 1) / 2 | q1 <- a])"}, @@ -18,7 +18,7 @@ "constraint": "|a| / 2 = sum([toInt(q2 % 2 = 0) | q2 <- a])"}, "7": {"onVariable": "a", "groups": ["MSetCardinality", "IntLowHigh"], - "constraint": "|a| / 2 = sum([toInt(q2 < 1 + (10 - 1) / 2) | q2 <- a])"}, + "constraint": "|a| / 2 = sum([toInt(q2 <= 1 + (10 - 1) / 2) | q2 <- a])"}, "8": {"onVariable": "a", "groups": ["MSetCardinality", "IntLowHigh"], "constraint": "|a| / 2 = sum([toInt(q2 > 1 + (10 - 1) / 2) | q2 <- a])"}, @@ -30,7 +30,7 @@ "constraint": "1 >= sum([toInt(q3 % 2 = 0) | q3 <- a])"}, "11": {"onVariable": "a", "groups": ["MSetCardinality", "IntLowHigh"], - "constraint": "1 >= sum([toInt(q3 < 1 + (10 - 1) / 2) | q3 <- a])"}, + "constraint": "1 >= sum([toInt(q3 <= 1 + (10 - 1) / 2) | q3 <- a])"}, "12": {"onVariable": "a", "groups": ["MSetCardinality", "IntLowHigh"], "constraint": "1 >= sum([toInt(q3 > 1 + (10 - 1) / 2) | q3 <- a])"}, @@ -42,7 +42,7 @@ "constraint": "|a| / 2 + 1 >= sum([toInt(q4 % 2 = 0) | q4 <- a]) /\\ |a| / 2 - 1 <= sum([toInt(q4 % 2 = 0) | q4 <- a])"}, "15": {"onVariable": "a", "groups": ["MSetCardinality", "IntLowHigh"], - "constraint": "|a| / 2 + 1 >= sum([toInt(q4 < 1 + (10 - 1) / 2) | q4 <- a]) /\\ |a| / 2 - 1 <= sum([toInt(q4 < 1 + (10 - 1) / 2) | q4 <- a])"}, + "constraint": "|a| / 2 + 1 >= sum([toInt(q4 <= 1 + (10 - 1) / 2) | q4 <- a]) /\\ |a| / 2 - 1 <= sum([toInt(q4 <= 1 + (10 - 1) / 2) | q4 <- a])"}, "16": {"onVariable": "a", "groups": ["MSetCardinality", "IntLowHigh"], "constraint": "|a| / 2 + 1 >= sum([toInt(q4 > 1 + (10 - 1) / 2) | q4 <- a]) /\\ |a| / 2 - 1 <= sum([toInt(q4 > 1 + (10 - 1) / 2) | q4 <- a])"}, @@ -54,7 +54,7 @@ "constraint": "|a| / 2 <= sum([toInt(q5 % 2 = 0) | q5 <- a])"}, "19": {"onVariable": "a", "groups": ["MSetCardinality", "IntLowHigh"], - "constraint": "|a| / 2 <= sum([toInt(q5 < 1 + (10 - 1) / 2) | q5 <- a])"}, + "constraint": "|a| / 2 <= sum([toInt(q5 <= 1 + (10 - 1) / 2) | q5 <- a])"}, "20": {"onVariable": "a", "groups": ["MSetCardinality", "IntLowHigh"], "constraint": "|a| / 2 <= sum([toInt(q5 > 1 + (10 - 1) / 2) | q5 <- a])"}, @@ -66,7 +66,7 @@ "constraint": "|a| / 2 >= sum([toInt(q6 % 2 = 0) | q6 <- a])"}, "23": {"onVariable": "a", "groups": ["MSetCardinality", "IntLowHigh"], - "constraint": "|a| / 2 >= sum([toInt(q6 < 1 + (10 - 1) / 2) | q6 <- a])"}, + "constraint": "|a| / 2 >= sum([toInt(q6 <= 1 + (10 - 1) / 2) | q6 <- a])"}, "24": {"onVariable": "a", "groups": ["MSetCardinality", "IntLowHigh"], "constraint": "|a| / 2 >= sum([toInt(q6 > 1 + (10 - 1) / 2) | q6 <- a])"}} diff --git a/tests/custom/transform/function/matrix/const_01/stdout.expected b/tests/custom/transform/function/matrix/const_01/stdout.expected index 363e0cc55c..25ac415495 100644 --- a/tests/custom/transform/function/matrix/const_01/stdout.expected +++ b/tests/custom/transform/function/matrix/const_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/matrix/var_01/stdout.expected b/tests/custom/transform/function/matrix/var_01/stdout.expected index 07284b2a06..593def2606 100644 --- a/tests/custom/transform/function/matrix/var_01/stdout.expected +++ b/tests/custom/transform/function/matrix/var_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/partition/const_01/stdout.expected b/tests/custom/transform/function/partition/const_01/stdout.expected index f8f1b087a3..4b20e13c8b 100644 --- a/tests/custom/transform/function/partition/const_01/stdout.expected +++ b/tests/custom/transform/function/partition/const_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/partition/var_01/stdout.expected b/tests/custom/transform/function/partition/var_01/stdout.expected index 29af8f549a..ac15406938 100644 --- a/tests/custom/transform/function/partition/var_01/stdout.expected +++ b/tests/custom/transform/function/partition/var_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/record/const_01/stdout.expected b/tests/custom/transform/function/record/const_01/stdout.expected index dd6fee3ee4..94c6032df9 100644 --- a/tests/custom/transform/function/record/const_01/stdout.expected +++ b/tests/custom/transform/function/record/const_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/record/var_01/stdout.expected b/tests/custom/transform/function/record/var_01/stdout.expected index 2e6fcba9d3..02b22ae138 100644 --- a/tests/custom/transform/function/record/var_01/stdout.expected +++ b/tests/custom/transform/function/record/var_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/record/var_02/stdout.expected b/tests/custom/transform/function/record/var_02/stdout.expected index 06794c62fc..e91807d779 100644 --- a/tests/custom/transform/function/record/var_02/stdout.expected +++ b/tests/custom/transform/function/record/var_02/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/sequence/const_01/stdout.expected b/tests/custom/transform/function/sequence/const_01/stdout.expected index 5d0bbcd30f..5d20c8cebe 100644 --- a/tests/custom/transform/function/sequence/const_01/stdout.expected +++ b/tests/custom/transform/function/sequence/const_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/sequence/var_01/stdout.expected b/tests/custom/transform/function/sequence/var_01/stdout.expected index f71c819b66..2a17a567ce 100644 --- a/tests/custom/transform/function/sequence/var_01/stdout.expected +++ b/tests/custom/transform/function/sequence/var_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/set/const_01/stdout.expected b/tests/custom/transform/function/set/const_01/stdout.expected index f293b042b4..9bd989e7ef 100644 --- a/tests/custom/transform/function/set/const_01/stdout.expected +++ b/tests/custom/transform/function/set/const_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/set/var_01/stdout.expected b/tests/custom/transform/function/set/var_01/stdout.expected index f293b042b4..9bd989e7ef 100644 --- a/tests/custom/transform/function/set/var_01/stdout.expected +++ b/tests/custom/transform/function/set/var_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/set/var_02/stdout.expected b/tests/custom/transform/function/set/var_02/stdout.expected index f293b042b4..9bd989e7ef 100644 --- a/tests/custom/transform/function/set/var_02/stdout.expected +++ b/tests/custom/transform/function/set/var_02/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/tuple/const_01/stdout.expected b/tests/custom/transform/function/tuple/const_01/stdout.expected index b80358b0dc..be0dcb71a2 100644 --- a/tests/custom/transform/function/tuple/const_01/stdout.expected +++ b/tests/custom/transform/function/tuple/const_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/tuple/var_01/stdout.expected b/tests/custom/transform/function/tuple/var_01/stdout.expected index c246af9a45..b83d5abb5f 100644 --- a/tests/custom/transform/function/tuple/var_01/stdout.expected +++ b/tests/custom/transform/function/tuple/var_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/variant/const_01/stdout.expected b/tests/custom/transform/function/variant/const_01/stdout.expected index 373a742d51..48dbea4cfe 100644 --- a/tests/custom/transform/function/variant/const_01/stdout.expected +++ b/tests/custom/transform/function/variant/const_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/variant/var_01/stdout.expected b/tests/custom/transform/function/variant/var_01/stdout.expected index 373a742d51..48dbea4cfe 100644 --- a/tests/custom/transform/function/variant/var_01/stdout.expected +++ b/tests/custom/transform/function/variant/var_01/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/variant/var_02/stdout.expected b/tests/custom/transform/function/variant/var_02/stdout.expected index 373a742d51..48dbea4cfe 100644 --- a/tests/custom/transform/function/variant/var_02/stdout.expected +++ b/tests/custom/transform/function/variant/var_02/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/variant/var_03/stdout.expected b/tests/custom/transform/function/variant/var_03/stdout.expected index f960ed15d7..b5b2d922dc 100644 --- a/tests/custom/transform/function/variant/var_03/stdout.expected +++ b/tests/custom/transform/function/variant/var_03/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/transform/function/variant/var_04/stdout.expected b/tests/custom/transform/function/variant/var_04/stdout.expected index 18c365b356..7f2d40440c 100644 --- a/tests/custom/transform/function/variant/var_04/stdout.expected +++ b/tests/custom/transform/function/variant/var_04/stdout.expected @@ -1,7 +1,7 @@ Generating models for function.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running minion for domain filtering. Running solver: minion Copying solution to: function.solution diff --git a/tests/custom/tugce_1/stdout.expected b/tests/custom/tugce_1/stdout.expected index c9088e59f7..36da754d36 100644 --- a/tests/custom/tugce_1/stdout.expected +++ b/tests/custom/tugce_1/stdout.expected @@ -1,7 +1,7 @@ Generating models for tugce_1.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime +Savile Row: conjure-output/model000001.eprime Running solver: chuffed Copying solution to: tugce_1.solution language Essence 1.3 diff --git a/tests/custom/variant-motif/stdout.expected b/tests/custom/variant-motif/stdout.expected index 548ed94255..d766f66531 100644 --- a/tests/custom/variant-motif/stdout.expected +++ b/tests/custom/variant-motif/stdout.expected @@ -1,7 +1,7 @@ Generating models for motif.essence Generated models: model000001.eprime Saved under: conjure-output -Savile Row: model000001.eprime data/zkc.param +Savile Row: conjure-output/model000001.eprime data/zkc.param Running minion for domain filtering. Running solver: minion edges: [(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 11), (1, 12), (1, 13), (1, 14), (1, 18), (1, 20), (1, 22), (1, 32), (2, 3), (2, 4), (2, 8), (2, 14), (2, 18), (2, 20), (2, 22), (2, 31), (3, 4), (3, 8), (3, 9), (3, 10), (3, 14), (3, 28), (3, 29), (3, 33), (4, 8), (4, 13), (4, 14), (5, 7), (5, 11), (6, 7), (6, 11), (6, 17), (7, 17), (9, 33), (10, 34), (14, 34), (15, 33), (15, 34), (16, 33), (16, 34), (19, 33), (19, 34), (20, 34), (21, 33), (21, 34), (24, 26), (25, 28), (31, 33), (32, 33)] diff --git a/tests/exhaustive/basic/sequence_subseq_dups/expected/model.eprime b/tests/exhaustive/basic/sequence_subseq_dups/expected/model.eprime index 7a0286b781..4f16192b1b 100644 --- a/tests/exhaustive/basic/sequence_subseq_dups/expected/model.eprime +++ b/tests/exhaustive/basic/sequence_subseq_dups/expected/model.eprime @@ -15,10 +15,11 @@ such that b_ExplicitBounded_Length = conjure_aux1_ExplicitBounded_Length, and([q6 <= b_ExplicitBounded_Length -> and([b_ExplicitBounded_Values[q6] = - sum([toInt(q8 = conjure_aux1_ExplicitBounded_Values[q6]) * catchUndef([1, 1, 2; int(1..3)][q8], 0) - | q8 : int(1..3)]), - or([q10 = conjure_aux1_ExplicitBounded_Values[q6] | q10 : int(1..3), q10 <= 3]), - q6 <= conjure_aux1_ExplicitBounded_Length; + sum([toInt(1 = conjure_aux1_ExplicitBounded_Values[q6]), + toInt(2 = conjure_aux1_ExplicitBounded_Values[q6]), + toInt(3 = conjure_aux1_ExplicitBounded_Values[q6]) * 2; + int(1..3)]), + conjure_aux1_ExplicitBounded_Values[q6] <= 3, q6 <= conjure_aux1_ExplicitBounded_Length; int(1..3)]) | q6 : int(1..2)]), and([q1 > b_ExplicitBounded_Length -> b_ExplicitBounded_Values[q1] = 1 | q1 : int(1..2)]), diff --git a/tests/exhaustive/basic/sequence_subseq_nodups/expected/model.eprime b/tests/exhaustive/basic/sequence_subseq_nodups/expected/model.eprime index 96f6872240..f2dda32fe8 100644 --- a/tests/exhaustive/basic/sequence_subseq_nodups/expected/model.eprime +++ b/tests/exhaustive/basic/sequence_subseq_nodups/expected/model.eprime @@ -15,10 +15,11 @@ such that b_ExplicitBounded_Length = conjure_aux1_ExplicitBounded_Length, and([q6 <= b_ExplicitBounded_Length -> and([b_ExplicitBounded_Values[q6] = - sum([toInt(q8 = conjure_aux1_ExplicitBounded_Values[q6]) * catchUndef([3, 1, 2; int(1..3)][q8], 0) - | q8 : int(1..3)]), - or([q10 = conjure_aux1_ExplicitBounded_Values[q6] | q10 : int(1..3), q10 <= 3]), - q6 <= conjure_aux1_ExplicitBounded_Length; + sum([toInt(1 = conjure_aux1_ExplicitBounded_Values[q6]) * 3, + toInt(2 = conjure_aux1_ExplicitBounded_Values[q6]), + toInt(3 = conjure_aux1_ExplicitBounded_Values[q6]) * 2; + int(1..3)]), + conjure_aux1_ExplicitBounded_Values[q6] <= 3, q6 <= conjure_aux1_ExplicitBounded_Length; int(1..3)]) | q6 : int(1..2)]), and([q1 > b_ExplicitBounded_Length -> b_ExplicitBounded_Values[q1] = 1 | q1 : int(1..2)]),