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=INT | Random number generator seed. |
| --limit-models=INT | Maximum number of models to generate. |
| --use-existing-models=FILE | File 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=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/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)]),