.. _xcsp3: ******************************************* Solving XCSP3 Instances (CLI and Java API) ******************************************* `XCSP3 `__ :cite:`lecoutre2020xcsp3` is the standard XML-based format for representing combinatorial constrained problems — both satisfaction (**CSP**) and optimization (**COP**) — used in the International XCSP3 Solver Competitions. MaxiCP includes a built-in XCSP3 parser and competition runner in the ``org.maxicp.modeling.xcsp3`` package that translates XCSP3 instances (plain ``.xml`` or compressed ``.xml.lzma``) into a symbolic ``ModelDispatcher`` and solves them either with **Black-Box Search** (:ref:`maxicp_search`) or with a custom search strategy. Source: * `XCSP3 `__ — XCSP3 parser and ``XCSP3LoadedInstance`` loader * `XCSP3Cli `__ — Competition CLI entrypoint Running an XCSP3 Instance from the Command Line ================================================= There are two ways to solve an XCSP3 instance from the terminal: using the standalone competition bundle (recommended) or invoking ``XCSP3Cli`` directly via Java/Maven. Option 1 — Standalone ``maxicp-mini`` Bundle (Recommended) ----------------------------------------------------------- From the repository root, build the self-contained competition bundle: .. code-block:: bash ./scripts/package-mini-xcsp3.sh This script compiles MaxiCP, copies all runtime JARs into ``mini-xcsp3/lib/``, and generates the executable launcher ``mini-xcsp3/maxicp-mini``. You can then run any ``.xml`` or ``.xml.lzma`` XCSP3 instance: .. code-block:: bash # Solve a satisfaction (CSP) instance ./mini-xcsp3/maxicp-mini src/test/resources/XCSP3/CSP/HyperSudoku-03_c24.xml # Optimize a COP instance with a 10-second time limit and fixed random seed ./mini-xcsp3/maxicp-mini --time-limit=10 --seed=42 src/test/resources/XCSP3/COP/LitPuzzle-10_c24.xml # Run a compressed .xml.lzma instance ./mini-xcsp3/maxicp-mini --time-limit=30 data/XCSP3/2024_V3/MiniCOP/Fortress1-02-mini_c25.xml.lzma Supported CLI arguments: .. list-table:: :widths: 32 68 :header-rows: 1 * - Argument - Description * - ```` - Path to the XCSP3 instance file (``.xml`` or ``.xml.lzma``). * - ``--time-limit=`` - Wall-clock time limit in seconds (defaults to unlimited if omitted). * - ``--seed=`` *(or 2nd positional arg)* - Random seed used for tie-breaking, restarts, and LNS neighborhoods. * - ``--mem-limit=...`` / ``--tmpdir=...`` - Accepted for compatibility with XCSP3 competition evaluation wrappers. Option 2 — Running ``XCSP3Cli`` Directly with ``java`` ------------------------------------------------------- Once packaged (or after ``mvn compile dependency:copy-dependencies``), you can also invoke the ``org.maxicp.modeling.xcsp3.XCSP3Cli`` class directly: .. code-block:: bash java -cp "mini-xcsp3/lib/*" org.maxicp.modeling.xcsp3.XCSP3Cli \ --time-limit=10 \ src/test/resources/XCSP3/COP/LitPuzzle-10_c24.xml Reading the Competition Output Protocol ---------------------------------------- ``XCSP3Cli`` follows the official XCSP3 competition output stream protocol: * ``o `` — printed each time a new improving objective value ```` is found (for COP instances). * ``s `` — final status line: * ``s SATISFIABLE`` — at least one feasible solution was found (and optimality was not proven for COP). * ``s OPTIMUM FOUND`` — an optimal solution was found and proven (for COP). * ``s UNSATISFIABLE`` — the instance was proven infeasible. * ``s UNKNOWN`` — no solution was found within the time limit. * ``s UNSUPPORTED`` — the instance uses an XCSP3 feature not supported by the parser. * ``v ... `` — the variable assignment of the best solution found, formatted as a valid XCSP3 ```` element. Example output on an optimization instance:: o 18 o 15 o 14 s OPTIMUM FOUND v x[0] x[1] x[2] ... 1 0 1 ... Running an XCSP3 Instance in Java =================================== You can also load and solve XCSP3 instances directly from your Java code using ``XCSP3.load(...)`` or ``XCSP3.runWithBlackBox(...)``. Quick One-Liner with Validation (``XCSP3.runWithBlackBox``) ------------------------------------------------------------ For quick experiments, ``XCSP3.runWithBlackBox(path, timeoutInSeconds)`` loads the instance, runs ``BlackBoxSearch`` with progress logging, and automatically validates the resulting ```` with the official XCSP3 ``SolutionChecker``: .. code-block:: java import org.maxicp.modeling.xcsp3.XCSP3; public class RunXCSP3Demo { public static void main(String[] args) throws Exception { XCSP3.runWithBlackBox("src/test/resources/XCSP3/COP/LitPuzzle-10_c24.xml", 10); } } Loading an Instance and Solving with ``BlackBoxSearch`` -------------------------------------------------------- ``XCSP3.load(filename)`` parses the XML file and returns an ``XCSP3LoadedInstance`` record (which implements ``AutoCloseable``): * ``instance.md()`` — the ``ModelDispatcher`` containing all parsed variables, variable groups, and constraints. * ``instance.decisionVars()`` — the array of decision variables (``IntExpression[]``). * ``instance.decisionVarIds()`` — the XCSP3 variable identifiers (``String[]``). * ``instance.objective()`` — the symbolic ``Objective`` to optimize, or ``null`` for satisfaction (CSP) instances. * ``instance.formatSolution(result)`` / ``instance.solutionGenerator()`` — formats a solution into an XCSP3 ```` XML string. Here is how to load an instance, solve or optimize it with ``ModelingBlackBox``, and validate the solution: .. code-block:: java import org.maxicp.modeling.xcsp3.XCSP3; import org.maxicp.search.blackbox.ModelingBlackBox; import org.xcsp.parser.callbacks.SolutionChecker; import java.io.ByteArrayInputStream; String path = "src/test/resources/XCSP3/COP/LitPuzzle-10_c24.xml"; int timeoutSeconds = 10; try (XCSP3.XCSP3LoadedInstance instance = XCSP3.load(path)) { ModelingBlackBox.Result result = instance.objective() != null ? ModelingBlackBox.optimize(instance.md(), instance.objective(), timeoutSeconds) : ModelingBlackBox.solve(instance.md(), timeoutSeconds); System.out.println("Status: " + result.status()); result.objectiveValue().ifPresent(obj -> System.out.println("Best objective: " + obj)); if (result.solution().isPresent()) { String solXml = instance.formatSolution(result); System.out.println(solXml); // Optional: verify the solution with the official XCSP3 SolutionChecker SolutionChecker checker = new SolutionChecker( false, path, new ByteArrayInputStream(solXml.getBytes())); assert checker.invalidObjs.isEmpty() && checker.violatedCtrs.isEmpty(); } } Solving an XCSP3 Instance with a Custom Search Strategy -------------------------------------------------------- Because ``XCSP3.load(path)`` populates a standard ``ModelDispatcher``, you can also concretize the model with ``runCP`` and apply any MaxiCP search heuristic (such as ``firstFailBinary``, ``conflictOrderingSearch``, or ``fds``) instead of ``BlackBoxSearch``: .. code-block:: java import org.maxicp.modeling.xcsp3.XCSP3; import org.maxicp.search.DFSearch; import org.maxicp.search.SearchStatistics; import org.maxicp.search.Searches; String path = "src/test/resources/XCSP3/CSP/HyperSudoku-03_c24.xml"; try (XCSP3.XCSP3LoadedInstance instance = XCSP3.load(path)) { instance.md().runCP(cp -> { DFSearch dfs = cp.dfSearch(Searches.firstFailBinary(instance.decisionVars())); dfs.onSolution(() -> { String xmlInstantiation = instance.solutionGenerator().get(); System.out.println(xmlInstantiation); }); SearchStatistics stats = instance.objective() != null ? dfs.optimize(instance.objective()) : dfs.solve(s -> s.numberOfSolutions() >= 1); System.out.println(stats); }); } Supported XCSP3 Constraints and Objectives =========================================== MaxiCP's XCSP3 parser supports the core XCSP3 / Mini-Track and Main-Track integer constraint families: * **Intensional & Primitive**: ``intension`` (arbitrary boolean/arithmetic syntax trees including ``add``, ``sub``, ``mul``, ``div``, ``mod``, ``pow``, ``sqr``, ``abs``, ``dist``, ``min``, ``max``, ``if``, ``in``, ``notin``, relational and logical operators), ``primitive`` unary/binary/ternary constraints, ``clause``, and ``logic``. * **Extensional**: ``extension`` (unary and *n*-ary positive and negative table constraints, including starred ``*`` tuples via ``ShortTableCT`` / ``TableCT`` / ``NegTable``). * **Comparison & Ordering**: ``allDifferent`` (including ``except`` and ``allDifferentList``), ``allEqual``, ``notAllEqual``, ``ordered`` / ``lex`` / ``lexMatrix``. * **Counting & Summing**: ``sum`` (weighted, unweighted, and view/expression sums with ``EQ``, ``NE``, ``LT``, ``LE``, ``GT``, ``GE``, ``IN``, ``NOTIN`` conditions), ``count``, ``atLeast``, ``atMost``, ``exactly``, ``among``, ``cardinality`` (closed/open with constant or variable occurrences), ``nValues``. * **Connection & Indexing**: ``element`` (1D and 2D constant or variable arrays/matrices), ``minimum``, ``maximum``, ``channel`` (permutation, inverse with offset, and boolean indicator channeling), ``instantiation``. * **Languages, Graphs & Packing**: ``regular`` (DFA), ``mdd`` (Multi-valued Decision Diagrams), ``circuit``, ``noOverlap`` (1D disjunctive and *k*-D diffn), ``cumulative``, ``binPacking``, ``knapsack``. * **Objectives**: ``minimize`` and ``maximize`` on ``EXPRESSION``, ``SUM``, ``PRODUCT``, ``MINIMUM``, ``MAXIMUM``, and ``NVALUES``.